2017-01-26 46 views
1

我正在與一個聲稱支持C++的平臺的開發人員交談,但他們同時表示,在程序退出時清理的靜態變量的數量(我認爲他們在他們的平臺上說了32),他們說這符合C++標準。C++中限制靜態變量的數量

這是正確的嗎?

+1

根本不正確。 – selbie

+1

我希望編譯器至少對此提出警告 – MikeMB

+0

實現總是有侷限性。例如,模板遞歸的深度,標識符的長度或可以調試的翻譯單元中的最大行數(Solaris長時間爲65536)。 –

回答

6

該標準說明如果所有析構函數必須有副作用,纔會被調用。

[basic.start.term]/1:析構函數(12.4),用於初始化的對象(即,對象,其壽命(3.8)已經開始)具有靜態存儲 持續時間被稱爲從主和作爲調用的std的結果返回的結果::退出(18.5)。 [...]

[basic.stc.static]/2:如果一個具有靜態存儲持續時間的變量具有初始化或具有副作用的析構函數,即使它看起來沒有被使用,但不應該被 消除,除非類對象或其複製/移動按照12.8的規定可以取消 。 關鍵字static可用於聲明具有靜態存儲持續時間的局部變量。

然而,在符合標準的規則也允許一些餘地,當談到實現限制:

[intro.compilance]/2.1:如果程序包含在本國際標準中沒有違反規則,一個符合要求的執行應,在其資源限制內,接受並正確執行該程序。

對允許使用的靜態變量的數量進行硬性限制可能看起來很奇怪,但常見的實現對各種事物都有嚴格的限制,例如,模板實例化深度。

2

如果在程序退出時清理的靜態變量有限制,它肯定不會被C++語言標準強制執行。

然而,取決於平臺,編譯器和運行時庫,可能存在一些限制,即在具有小CPU能力和/或嚴格的存儲器限制的嵌入式平臺上。

+0

但是他們不符合標準,如果我找到你的權利 – user1235183

+0

該標準允許實施的一些自由,如果它符合並且不違反其他規則。請參閱TartanLlama回答參考。 – roalz

+1

我會把它稱爲「標準不要求*限制具有析構函數的靜態變量的數量 - 但它確實*允許*這樣的限制。 –