其實了解 sizeof 隻需要抓住一個要點:棧
程式存儲分布有三個區域:棧、靜态和動态。能夠從代碼直接操作的對象,包括任何類型的變量、指針,都是在棧上的;動态和靜态存儲區是靠棧上的指針來間接操作的。sizeof 操作符,計算的是對象在棧上的投影體積;記住這個就很多東西都很清楚了。
char const * static_string = "Hello";
sizeof(static_string) 是 sizeof 一個指針,是以在 32bit system 是 4
char stack_string[] = "Hello";
sizeof(stack_string) 是 sizeof 一個數組,是以是 6 * sizeof(char)
char * string = new char[6];
strncpy(string,"Hello",6");
sizeof(string) 是 sizeof 一個指針,是以還是 4。和第一個不同的是,這個指針指向了動态存儲區而不是靜态存儲區。
不管指針指向的内容在什麼地方,sizeof 得到的都是指針的棧大小
C++ 中對引用的處理比較特殊;sizeof 一個引用得到的結果是 sizeof 一個被引用的對象的大小。
另外,看到的關于sizeof的兩個精巧的宏實作。
非數組的sizeof:
#defne _sizeof(T) ( (size_t)((T*)0 + 1) )
數組的sizeof:
#define array_sizeof(T) ( (size_t)(&T+1) - (size_t)(&T) )
原理就是c/c++中的指針運算。