我對運算符sizeof
的評估時間感到困惑。
sizeof運算符什麼時候被評估?sizeof運算符編譯時或運行時間
其評估時間[compile-time or run-time
]取決於語言[C? C++?
]?
如果在運行時創建對象[in C++
],我們可以使用sizeof
嗎?
我對運算符sizeof
的評估時間感到困惑。
sizeof運算符什麼時候被評估?sizeof運算符編譯時或運行時間
其評估時間[compile-time or run-time
]取決於語言[C? C++?
]?
如果在運行時創建對象[in C++
],我們可以使用sizeof
嗎?
在幾乎所有情況下,sizeof
都是基於靜態類型信息(在編譯時,基本上)進行評估。
一個例外(我認爲唯一的例外)就是C99的可變長度數組(VLA)。
幾乎總是編譯時間。但是,下面的例子可能是你的興趣:
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
也許「void foo(char [100] x)」實際上應該是「void foo(char x [100])」? –
編譯時間,因爲它是在編譯時計算出的大小「編譯時間」,當你建立你的代碼 - 當編譯器的源代碼轉換成IL。
一個很好的證明什麼是一個荒謬的變態VLAs。恕我直言,顯式可變長度堆棧消耗('alloca')非常好。 – valdo
@valdo,我不明白這應該證明什麼。在執行時間動態調整大小的對象時,必須在執行時對其進行評估,這似乎很正常。並且比較其他機制,比如'alloca'(甚至沒有標準化並且沒有範圍界定)或者'malloc',它們都不知道它們創建的對象的大小並不是很有幫助。 –
@Jens Gustedt:對不起,我的意思是* example *,而不是* proof *。 'alloca'不需要顯式的釋放/範圍。生成的代碼(或多或少)與VLA相同 - 移動堆棧指針+在頁面邊界交叉時探測堆棧內存。我個人在元編程(temapltes等)中非常積極地使用'sizeof',並且我想100%確定'sizeof'裏面的任何內容都不會在運行時被評估。 – valdo