C 各種全域性常量的宣告方式的優缺點

2021-06-09 19:58:32 字數 2403 閱讀 1253

(1) 一般用途的const變數,絕對不應該宣告在標頭檔案,定義在cpp裡,尤其是基礎型別(int之類)這個和inline函式是類似的,編譯器能自動處理不同cpp中有同樣const的問題;如果不使用const變數的位址,這個const變數最終會被完全優化掉,不佔靜態儲存空間。而如果定義成extern,會導致編譯器不得不為這個變數分配乙個位址,並且在使用的時候強制地去從位址取得值,這會導致極大的效能下降。比如:

const

inta =16

;inline

intsqr(x

)myfunc

(sqr(a

));

在這裡,編譯器可以把整個sqr(a)都優化掉,替換成乙個立即數256。而如果a定義成了extern,這裡就必須是讀數值、乘法、傳引數的過程了。

c++中編譯器對於const變數做了充分的優化,它完全可以取代#define常量的一切功能。

比如:

const

intmax_n

=100

;int

myarray

[max_n

];

在遇到使用const變數的時候,編譯器如果已知const變數的值,就會直接把值代入進行優化,和#define是完全一樣的。如果最後const變數沒有取位址之類的操作,編譯器就會認為這個變數沒有被實際引用,於是在生成**的最後把整個const變數去掉。

const變數如果不另加定義,預設就是static的。特意去定義成extern只會破壞編譯器效率。這個和c是完全不同的,所以不要把c的法則想當然地用進來。

不過對於const變數型別是複雜型別(類)的時候,static的型別可能會導致每個cpp裡面都生成乙個物件,這時候應該考慮extern。

(2) const變數和#define巨集相比最大的好處其實不在於型別檢查,而在於可以有命名空間

namespace

mynamespace

const

intmyconst2 =16

;}

myconst必須用mynamespace::myclass::myconst來引用,myconst2對應mynamespace::myconst2,而#define的兩個常量永遠都是mymacro和mymacro2,這意味著#define的常量重名的可能性要大得多,而且很容易破壞oop結構。

(3) 特殊情況下#define和const比可能會引起問題。比如函式過載:

void

myfunc

(intx)

void

myfunc

(shortx)

const

short

myconst

=128

;#define

mymacro

128myfunc

(myconst

);myfunc

(mymacro

);

#define由於沒有型別,會去呼叫int版本的函式。這是const強制型別檢查的好處

(4) const型別的編譯效率比較好

因為編譯器在編譯的時候已經知道這個符號對應的是某型別的數了,編譯會快一些。對執行影響不大。還有:

#define

maxn (12

*14)const

intmax_n =12

*14;

使用maxn的時候,編譯器每次都得對表示式求值;max_n的話,只求了一次。

(5) const型別不容易出錯

這個問題是老生常談了,#define macro 12+13這種寫法會出問題,必須加括號。const就沒這個問題。

(6) enum

enum其實可以看做是定義了一族const變數。它們同樣也有命名空間,同樣也有變數型別(不過變數型別是enum ***),額外的,enum定義的常量不會使用額外的記憶體空間。缺點在於:enum定義的常量,型別是enum ***,不是int。雖然可以和int型數值無限制地轉換,但畢竟不是int,使用上不是那麼方便,比如不能直接做加減乘除之類。

(7) #define的優勢

#define在c++中的作用一般已經不是定義常量或者巨集了,如前文所說這些功能應該由const和inline函式來代替。#define在c++中可以用來定義一些快捷語法,或者是根據編譯選項不同生成不同內容:

#define l(x) l##x

l("abcde") // l"abcde"

#ifdef _unicode

#define myfunc myfuncw

#else

#define myfunc myfunca

#endif

這些功能目前還沒有其他語法可以替代。

windows 記憶體管理的幾種方式及其優缺點

windows 記憶體管理方式主要分為 頁式管理,段式管理,段頁式管理。頁式管理 基本原理是將各程序的虛擬空間劃分為若干個長度相等的頁 頁式管理把記憶體空間按照頁的大小劃分成片或者頁面,然後把頁式虛擬位址與記憶體位址建立一一對應的頁表 並用相應的硬體位址變換機構來解決離散位址變換問題。頁式管理採用請...

Windows 記憶體管理的幾種方式及其優缺點

windows 記憶體管理方式主要分為 頁式管理,段式管理,段頁式管理。頁式管理的基本原理是將各程序的虛擬空間劃分為若干個長度相等的頁 頁式管理把記憶體空間按照頁的大小劃分成片或者頁面,然後把頁式虛擬位址與記憶體位址建立一一對應的頁表 並用相應的硬體位址變換機構來解決離散位址變換問題。頁式管理採用請...

js宣告全域性變數的方式

在js中有3中宣告全域性變數的方式 第一種使用var 變數名,在方法外部宣告 1 var msg 預設值undefined 2 function 6 function setmsg 9 function showmsg 第二種方式在方法內部宣告,但是不使用var關鍵字 1 function 5 fu...