2012-01-03 18 views
2

g++允許可變長度數組(VLA)作爲擴展。 sizeof操作者對VLAS結果非常有趣:gof對VLA的sizeof運算符進行了不同的評估嗎?

int main() 
{ 
    char size = 20, a[10], b[size]; 
    cout<<"sizeof(a) = "<<sizeof(a)<<endl; // sizeof(a) = 10, (can be used as template param) 
    cout<<"sizeof(b) = "<<sizeof(b)<<endl; // sizeof(b) = 20 !! (can't used be as template param) 
} 

sizeof(b)情況下,是克++不以下其中sizeof僅在編譯時評估的標準是什麼?是sizeofoverloaded

+0

括號不是運算符名稱的一部分。它是'sizeof',而不是'sizeof()'。 – unwind 2012-01-03 16:41:00

回答

4

VLAS是一個例外規則的sizeof所述操作數未評價,如在C99指明,6.5.3.4/2:

如果操作數的類型是可變長度數組類型,操作數被評估;否則,操作數不計算,結果是一個整數常量。

此行爲是g ++擴展;在標準C++(高達幷包括C++ 14)中,sizeof的操作數永遠不會被評估(並且不允許使用VLA)。

3

可變長度數組是C99的一部分,它不在C++中。 Gcc允許它們作爲C++中的擴展,使用C99的行爲,確實說sizeof返回數組的實際大小(因此在運行時進行評估)。 The wikipedia article about sizeof給出了它的行爲的一個很好的總結。

4

在C99中引入了VLA。在C99中,sizeof(vla)不是編譯時常量,但會考慮數組的運行時大小。

gcc/g++允許非C99代碼中的VLA作爲擴展。當這樣做時,編譯器遵循C99語義。這是你正在觀察的。