char buf[10] = 「hello」; size_t a = sizeof(buf); size_t b = strlen(buf);
a的值爲10,b的值爲5,這是由於sizeof(buf)計算的是字符數組的大小,strlen(buf)計算的是「hello」的長度。c++
char buf[] = 「hello」; size_t a = sizeof(buf); size_t b = strlen(buf);
a的值爲6,b的值爲5,這是由於buf的大小在編譯期就肯定了,它的大小恰好能保存字符串「hello」,而字符串默認後面還有一個’0’字符,它佔用一個字節,故sizeof(buf)是6,strlen(buf)爲5。數組
void fun(void * p, char data[10]) { size_t a = sizeof(p); size_t b = sizeof(data); }
a的值爲8,b的值也是爲8,這是由於a爲指針,在64位主機中指針類型長度爲8個字節;而有人會疑問爲何b的大小不是10,而是8呢?在c/c++中傳遞數組參數時會退化成傳遞指針,這其實也很好理解,由於不必傳遞參數的時候全拷貝數組元素,那樣過低效了,傳遞數組頭指針便可,在函數經過數組頭指針就能夠訪問數組中的任意元素。函數
class Test { //nothing. }; Test t; size_t a = sizeof(t);
a的值爲1,這是由於即便a是空類對象,它也須要經常使用存儲空間,而編譯器在這種狀況下給空類分配了一個字節,故大小爲1。測試
class Test { int32_t m_data; }; Test t; size_t a = sizeof(t);
a的值爲4,這是由於Test再也不是一個空類,它的對象中存儲着一個int32_t的變量,故大小爲4。spa
class Test { int32_t m_data; void fun(){}; }; Test t; size_t a = sizeof(t);
a的值爲4,這是由於普通函數只是文本段(text段)中的一段執行代碼,由類的全部對象共享,不會佔用對象的空間,故此時類對象的大小仍是4。指針
class Test { int32_t m_data; void fun(){}; virtual fun_v(){}; }; Test t; size_t a = sizeof(t);
a的值爲12,這是由於當類引入虛函數時,類對象中須要一個虛表指針來實現多態,在64位主機一個指針佔用8個字節,故類大小爲12。code
class Test { int32_t m_data; static int32_t m_static_data; void fun(){}; virtual void fun_v(){}; }; Test t; size_t a = sizeof(t);
a的值爲12,這是由於類的靜態成員變量是類共享的,不佔用類對象的空間,至關於c中靜態變量只是它被限定在類的命名空間(namespace)中,故類對象大小爲12。對象
class Test { int32_t m_data; static int32_t m_static_data; void fun(){}; virtual void fun_v(){}; static void fun_s(){}; }; Test t; size_t a = sizeof(t);
a的值爲12,這是由於靜態成員函數和普通成員函數同樣是文本段(text段)中的一段執行代碼,不佔用類對象空間,被限定在類的命名空間中,故大小爲12。內存
若是你們寫測試demo驗證添加了虛函數後類對象的大小時可能獲得的大小不是12,而是16,這是由於此時類是以8字節(虛表指針的大小)對齊,此時只要在代碼中指定4字節對齊(#pragma pack(4)),類對象大小就是12,至於內存對齊的概念你們自行去百度吧。字符串