C++優化程序的Tips

轉自個人博客

1. 避免創建過多中間變量

過多的中間變量不利于代碼的可讀性,還會增加內存的使用,而且可能導致額外的計算開銷。

將用于同一種情況的變量統一管理,可以使用一種通用的變量來代替多個變量。

2. 函數中習慣使用引用傳參而不是返回值賦值

常有的一種情況是,需要使用函數進行計算或處理數據,并通過其返回值獲得結果。

對于簡單的計算或處理,直接使用返回值返回結果無可厚非,方便快捷也影響不了多少運行效率。

但對于復雜處理,或對大數據量的變量進行處理時,就要習慣使用引用傳參進行賦值并獲得處理結果。引用傳參后函數能直接對原變量進行操作,能減少不必要的內存拷貝,提高運行效率。而且,可以使用返回值實現其他功能,比如用一個bool值返回操作是否成功。

#include <iostream>  int calculation(const int &x, const int &y) {  return x + y; // 簡單運算
}  bool complexCalculation(const int &x, const int &y, int &result) {// 復雜運算result = .....;return true;// 對于失敗情況返回false 
}int main() {  int a = 5, b = 10, result;  result = calculation(a, b);  // 直接獲取值if(complexCalculation(a, b, result)){ // 引用傳參std::cout << "Calculation successful" << result;}return 0;  
}  

3. 習慣使用const修飾參數

始終記得對需要的變量函數參數使用const關鍵字修飾是一個很好的習慣,比如上面的bool complexCalculation(const int &x, const int &y, int &result);

使用const變量能避免無意中修改變量參數值,尤其是后期維護或升級代碼時,有時候就會忘記以前寫的代碼的特定使用場景而為了圖方便直接修改。在需要的地方使用const修飾也有利于提高代碼可讀性和安全性。

4. 全局變量在使用的時候再分配內存

一般來說,全局變量會在程序啟動時分配內存,對于指針,一些人習慣性會在構造函數中分配需要的內存,而很多時候,這是不必要的,應該謹慎考慮變量的使用情況,在實際第一次需要的時候再分配內存。這樣能避免不必要的內存占用,也能避免一些內存泄露的情況。

class myClass {
public:explicit  myClass(){m_myArray = nullptr;}~myClass(){delete[] m_myArray;  };void myFunc(){m_myArray = new int[5]; // 在此處第一次需要時再分配內存for (int i = 0; i < 5; ++i) {  globalArray[i] = i * 10;  std::cout << globalArray[i] << std::endl;  } // 釋放內存也要再不需要的時候進行釋放}protected:int *m_myArray;  
};

5. 減少函數調用的次數

程序中跳轉執行的代價很高,不利于運行效率,而很多人忽視了一點是,常用的函數也是一種跳轉執行的情況。

每一次函數調用都帶來一定的開銷,在頻繁調用的情況下,合理管理這個開銷就顯得格外重要。

一般我們都習慣使用函數能提高代碼的可讀性,但有些時候這樣就會降低代碼的運行效率,有句話叫“效率高的代碼可讀性都不高”,雖然我們不必做到極致的高效率,但也要謹慎權衡效率和可讀性。

而要避免使用不必要的函數可以考慮通過內聯函數或者將常用常量作為全局變量來減少函數調用。

#include <iostream>  inline int square(int x) {  // 內聯函數  return x * x; 
}  int main() {  for (int i = 0; i < 5; ++i) {  // 減少函數調用的次數  std::cout << "Square of " << i << " is " << square(i) << std::endl; }  return 0;  
}  

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/86101.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/86101.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/86101.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C#Blazor應用-跨平臺WEB開發VB.NET

在 C# 中實現 Blazor 應用需要結合 Razor 語法和 C# 代碼&#xff0c;Blazor 允許使用 C# 同時開發前端和后端邏輯。以下是一個完整的 C# Blazor 實現示例&#xff0c;包含項目創建、基礎組件和數據交互等內容&#xff1a; 一、創建 Blazor 項目 使用 Visual Studio 新建項目 …

前端的安全隱患之API惡意調用

永遠不要相信前端傳來的數據&#xff0c;對于資深開發者而言&#xff0c;這幾乎是一種本能&#xff0c;無需過多解釋。然而&#xff0c;初入職場的開發新手可能會感到困惑&#xff1a;為何要對前端傳來的數據持有如此不信任的態度&#xff1f;難道人與人之間連基本的信任都不存…

基于 Spark 實現 COS 海量數據處理

上周在組內分享了一下這個主題&#xff0c; 我覺得還是摘出一部分當文章輸出出來 分享主要包括三個方面&#xff1a; 1. 項目背景 2.Spark 原理 3. Spark 實戰 項目背景 主要是將海量日志進行多維度處理&#xff1b; 項目難點 1、數據量大&#xff08;壓縮包數量 6TB,60 億條數…

Unity3D 屏幕點擊特效

實現點擊屏幕任意位置播放點擊特效。 屏幕點擊特效 需求 現有一個需求&#xff0c;點擊屏幕任意位置&#xff0c;播放一個點擊特效。 美術已經做好了特效&#xff0c;效果如圖&#xff1a; 特效容器 首先&#xff0c;畫布是 Camera 模式&#xff0c;畫布底下有一個 UIClic…

MCU編程

MCU 編程基礎&#xff1a;概念、架構與實踐 一、什么是 MCU 編程&#xff1f; MCU&#xff08;Microcontroller Unit&#xff0c;微控制器&#xff09; 是將 CPU、內存、外設&#xff08;如 GPIO、UART、ADC&#xff09;集成在單一芯片上的小型計算機系統。MCU 編程即針對這些…

Go語言--語法基礎6--基本數據類型--數組類型(1)

Go 語言提供了數組類型的數據結構。 數組是具有相同唯一類型的一組已編號且長度固定的數據項序列&#xff0c;這種類型可以是任意的 原始類型例如整型、字符串或者自定義類型。相對于去聲明number0,number1, ..., and number99 的變量&#xff0c;使用數組形式 numbers[0], …

左神算法之給定一個數組arr,返回其中的數值的差值等于k的子數組有多少個

目錄 1. 題目2. 解釋3. 思路4. 代碼5. 總結 1. 題目 給定一個數組arr&#xff0c;返回其中的數值的差值等于k的子數組有多少個 2. 解釋 略 3. 思路 直接用hashSet進行存儲&#xff0c;查這個值加上k后的值是否在數組中 4. 代碼 public class Problem01_SubvalueEqualk {…

自回歸(AR)與掩碼(MLM)的核心區別:續寫還是補全?

自回歸(AR)與掩碼(MLM)的核心區別:用例子秒懂 一、核心機制對比:像“續寫”還是“完形填空”? 維度自回歸(Autoregressive)掩碼語言模型(Masked LM)核心目標根據已生成的token,預測下一個token(順序生成)預測句子中被“掩碼”的token(補全缺失信息)輸入輸出輸入…

后端開發兩個月實習總結

前言 本人目前在一家小公司后端開發實習差不多兩個月了&#xff0c;現在準備離職了&#xff0c;就這兩個月的實習經歷寫下這篇文章&#xff0c;既是對自己實習的一個總結&#xff0c;也是給正在找實習的小伙伴以及未來即將進入到后端開發這個行業的同學的分享一下經驗。 一、個…

Python基礎(??FAISS?和??Chroma?)

??1. 索引與查詢性能? ??指標????FAISS????Chroma????分析????索引構建速度??72.4秒&#xff08;5551個文本塊&#xff09;91.59秒&#xff08;相同數據集&#xff09;FAISS的底層優化&#xff08;如PQ量化&#xff09;加速索引構建&#xff0c;適合批…

Windows下memcpy_s如何在Linux下使用

Windows下代碼如下 memcpy_s(pLine->ppBuf[i], m_ColorLineByte, pIn nOffset, m_ColorLineByte); 方案 1&#xff1a;使用標準 memcpy 手動檢查&#xff08;最通用&#xff09; // 檢查參數有效性 if (pLine->ppBuf[i] nullptr || pIn nullptr || m_ColorLi…

2025年數學算法與自動化控制國際會議(ICMAAC 2025)

2025年數學算法與自動化控制國際會議&#xff08;ICMAAC 2025&#xff09; 2025 International Conference on Mathematical Algorithms and Automation Control 一、大會信息 會議簡稱&#xff1a;ICMAAC 2025 大會地點&#xff1a;中國長沙 審稿通知&#xff1a;投稿后2-3日…

C語言數組介紹 -- 一維數組和二維數組的創建、初始化、下標、遍歷、存儲,C99 變長數組

目錄 1. 一維數組 1.1 數組的概念 1.2 一維數組的創建 1.3 一維數組的初始化 1.4 數組的類型 1.5 數組下標 1.5.1 數組元素的遍歷 1.5.2 數組的輸入 1.6 一維數組在內存中的存儲 1.7 sizeof 計算數組元素個數 2. 二維數組 2.1 二維數組的創建 2.2 二維數組的初始…

SpringAI + DeepSeek大模型應用開發 - 進階篇(上)

三、SpringAI 2. 哄哄模擬器 2.1 提示詞工程 提示詞工程&#xff08;Prompt Engineering&#xff09;&#xff1a;通過優化提示詞&#xff0c;使大模型生成盡可能理想的內容&#xff0c;這一過程就叫提示詞工程。 &#xff08;1&#xff09;清晰明確的指令 談談人工智能 …

Spring Boot實現異常處理

Spring Boot 提供了多種靈活的方式實現異常處理&#xff0c;以下是核心方案和最佳實踐&#xff1a; 一、基礎異常處理方案 1. ControllerAdvice ExceptionHandler&#xff08;全局處理&#xff09; ControllerAdvice public class GlobalExceptionHandler {// 處理特定異常&…

【目標檢測】IOU的概念與Python實例解析

&#x1f9d1; 博主簡介&#xff1a;曾任某智慧城市類企業算法總監&#xff0c;目前在美國市場的物流公司從事高級算法工程師一職&#xff0c;深耕人工智能領域&#xff0c;精通python數據挖掘、可視化、機器學習等&#xff0c;發表過AI相關的專利并多次在AI類比賽中獲獎。CSDN…

Vue2中如何使用vue-print-nb打印功能

插件官網地址&#xff1a;vue-print-nb - npm 1.安裝 npm install vue-print-nb --save 2.導入打印插件 //main.js import Print from vue-print-nb Vue.use(Print); 3.配置參數 4.頁面使用 <div id"printDiv">打印內容</div><el-button v-print&…

Matplotlib快速入門

目錄 基本使用 解決中文亂碼 一個坐標系繪制多個圖像 多個坐標系繪制 基本使用 什么是Matplotlib 是專門用于開發2D圖表(包括3D圖表)以漸進&#xff0c;交互式方式實現數據可視化 為什么要學習matplotlib 可視化是在整個數據挖掘的關鍵輔助工具&#xff0c;可以清晰的理解…

扣料不允許‘貨物移動’

遇到了報錯&#xff0c;不允許貨物移動 以為又是和之前一樣是訂單已經關閉&#xff0c;看是領錯料還是財務誤關的原因&#xff0c;但是co03一看訂單狀態并沒有關閉 原因就是這個CRTD 訂單只是創建了&#xff0c;但是沒有下達 找個正常的看看&#xff1a; 一般訂單創建和下達都…

【AI】全新AI測試系列之二--------AI自動化測試,提高測試效率

目錄 一、自動化測試 1、與手動測試對比 2、自動化測試流程 二、自動化測試環境搭建 三、web自動化使用AI的兩種方式 1、利用DeepSeek快速生成腳本 2、pycharm集成通義靈碼 四、通義靈碼實戰 1、使用提示詞生成代碼 2、使用pytest框架 前言&#xff1a;上一章節只要是…