##沒有躲過的坑--使用太多的全局變量
最近在工程中為了達到目的,使用了很多全局變量,導致程序運行效率降低。
在程序運行時,根據需要到內存中相應的存儲單元中調用,如果一個變量在程序中頻繁使用,例如循環變量,那么,系統就必須多次訪問內存中的該單元,影響程序的執行效率。因此,C\C++語言還定義了一種變量,不是保存在內存上,而是直接存儲在CPU中的寄存器中,這種變量稱為寄存器變量。
總覺得有些太low,就Google了一番。
首先我們清楚,有個叫寄存器的東西,如果是變量存儲在寄存器上,就相當于直接操作CPU,程序當然會運轉的很流暢;計算速度也是很快。
全部變量不是分配在寄存器上的,并且全局變量可以通過指針,函數等對其進行修改。所以尤其對于一些循環,一定要避免頻繁使用全局變量。
但是如果又避免不了使用全局變量,那該如何是好?
一個巧妙的方法就是把全局變量賦值給一個臨時變量,對臨時變量進行操作,最后再將臨時變量的值賦給全局變量。
請看代碼:
~~~
int f(void);
int g(void);
int errs;
void test1(void)
{
errs += f();
errs += g();
}
void test2(void)
{
int localerrs = errs;
localerrs += f();
localerrs += g();
errs = localerrs;
}
~~~
我們可以進行測試,test2的速度優于test1,尤其對于多次使用全局變量的時候。
既然提到了寄存器,現在就簡單聊一聊關鍵字register。
關鍵字register是C語言引入的,就是建議編譯器使用cpu寄存器來存儲自動變量:
~~~
register int count_fast;
~~~
目的就是為了提高訪問變量的速度。
在C++11之前,register在C++中扮演著同樣的角色。
在C++11中,register關鍵字不再表示是寄存器變量,而只是顯式指出變量是自動的。與auto關鍵字的作用相同。
但是為什么又不廢除呢??
當然是為了兼容前人所寫的代碼而已。
- 前言
- deprecated關鍵字
- 指針(內存泄露)
- 頭文件相互包含(Compiler error C2653: not a class or namespace name)
- 獲取一張圖片的width和height
- This function or variable may be unsafe.
- 智能指針陷阱
- wstring與string的轉換
- windows下chrome瀏覽器插件不能安裝
- 重定義關鍵字
- 正確釋放vector的內存
- 獲取設備環境HDC
- 抽象類不能實例化對象(但是你明明定義的不是抽象類)
- 重載賦值運算符的自我賦值
- 程序中的變量未初始化
- 成對使用new和delete時要采取相同的形式
- 意想不到的除數為零
- map的初始化(插入數據)
- 正則表達式截取字符串
- 捕獲窗口之外的鼠標消息(鉤子還是??)
- 類中的靜態成員變量(static or const static)
- 有if就要有else(一定成對)
- map查找結果處理
- 使用using namespace std的壞習慣
- new一個指針數組、以及創建動態二維數組
- 使用太多的全局變量
- 沒有及時break出for循環
- vector使用erase后迭代器變成野指針
- C++函數的默認參數(重新定義默認參數)
- 0xC0000005: 讀取位置 xxx時發生訪問沖突
- std::string初始化、最快速判斷字符串為空
- 你開發的軟件安裝在C盤Program Files (x86)下產生的異常