天天看點

了解sizeof

其實了解 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++中的指針運算。

上一篇: sizeof 總結