2012-06-24 81 views
10

我對運算符sizeof的評估時間感到困惑。
sizeof運算符什麼時候被評估?sizeof運算符編譯時或運行時間

其評估時間[compile-time or run-time]取決於語言[C? C++?]?

如果在運行時創建對象[in C++],我們可以使用sizeof嗎?

回答

19

在幾乎所有情況下,sizeof都是基於靜態類型信息(在編譯時,基本上)進行評估。

一個例外(我認爲唯一的例外)就是C99的可變長度數組(VLA)。

+0

一個很好的證明什麼是一個荒謬的變態VLAs。恕我直言,顯式可變長度堆棧消耗('alloca')非常好。 – valdo

+3

@valdo,我不明白這應該證明什麼。在執行時間動態調整大小的對象時,必須在執行時對其進行評估,這似乎很正常。並且比較其他機制,比如'alloca'(甚至沒有標準化並且沒有範圍界定)或者'malloc',它們都不知道它們創建的對象的大小並不是很有幫助。 –

+0

@Jens Gustedt:對不起,我的意思是* example *,而不是* proof *。 'alloca'不需要顯式的釋放/範圍。生成的代碼(或多或少)與VLA相同 - 移動堆棧指針+在頁面邊界交叉時探測堆棧內存。我個人在元編程(temapltes等)中非常積極地使用'sizeof',並且我想100%確定'sizeof'裏面的任何內容都不會在運行時被評估。 – valdo

11

幾乎總是編譯時間。但是,下面的例子可能是你的興趣:

char c[100]; 
sizeof(c); // 100 

char* d = malloc(100); 
sizeof(d); //probably 4 or 8. tells you the size of the pointer! 

BaseClass* b = new DerivedClass(); 
sizeof(b); //probably 4 or 8 as above. 

void foo(char[100] x) { 
    sizeof(x); //probably 4 or 8. I hate this. Don't use this style for this reason. 
} 

struct Foo { 
    char a[100]; 
    char b[200]; 
}; 

sizeof(struct Foo); //probably 300. Technically architecture dependent but it will be 
//the # of bytes the compiler needs to make a Foo. 

struct Foo foo; 
sizeof(foo); //same as sizeof(struct Foo) 

struct Foo* fooP; 
sizeof(fooP); //probably 4 or 8 

class ForwardDeclaredClass; 

ForwardDeclaredClass* p; 
sizeof(p); //4 or 8 
ForwardDeclaredClass fdc; //compile time error. Compiler 
//doesn't know how many bytes to allocate 

sizeof(ForwardDeclaredClass); //compile time error, same reason 
+0

也許「void foo(char [100] x)」實際上應該是「void foo(char x [100])」? –

0

編譯時間,因爲它是在編譯時計算出的大小「編譯時間」,當你建立你的代碼 - 當編譯器的源代碼轉換成IL。