某日二師兄參加XXX科技公司的C++工程師開發崗位第10面: > 面試官:瞭解`sizeof`操作符嗎? > > 二師兄:略微瞭解(不就是求大小的嘛。。) > > 面試官:請講以下如何使用`sizeof`? > > 二師兄:`sizeof`主要是求變數或者類型的大小。直接使用`sizeof(type ...
某日二師兄參加XXX科技公司的C++工程師開發崗位第10面:
面試官:瞭解
sizeof
操作符嗎?二師兄:略微瞭解(不就是求大小的嘛。。)
面試官:請講以下如何使用
sizeof
?二師兄:
sizeof
主要是求變數或者類型的大小。直接使用sizeof(type)
或sizeof(var)
即可。面試官:嗯。
sizeof(int*)
、sizeof(int**)
和sizeof(int[4])
各返回什麼?二師兄:前兩者的返回值相等。在32位操作系統中返回4,64位操作系統中返回8。
sizeof(int[4])
返回16,是因為sizeof
運算時數組不會退化為指針。面試官:如果一個
int* p = nullptr
,那麼對其進行sizeof(*p)
會發生什麼?二師兄:返回4。原因是
sizeof
在編譯時求值,sizeof
只需要獲取*p
的類型,並不對*p
求值。所以不會發生段錯誤。面試官:下麵三個
szieof
運算符,各返回什麼?
#include <iostream>
#include <string>
int main(int argc, char const *argv[])
{
const char* str1 = "hello";
char str2[] = "hello";
std::string str3 = "hello";
std::cout << sizeof(str1) << std::endl;
std::cout << sizeof(str2) << std::endl;
std::cout << sizeof(str3) << std::endl;
}
二師兄:第一個返回4或8,因為它是個指針,第二個是個數組,不過末尾有個
\0
結束符,所以它的值是6,第三個不清楚,但是等於sizeof(std::string)
。面試官:好的。使用
sizeof
對以下兩個結構體求大小,
#include <iostream>
struct Foo
{
char c;
int i;
double d;
};
struct Goo
{
char c;
double d;
int i;
};
int main(int argc, char const *argv[])
{
std::cout << sizeof(Foo) << std::endl;
std::cout << sizeof(Goo) << std::endl;
}
二師兄:
sizeof(Foo)
應該等於16,而sizeof(Goo)
應該等於24。因為需要記憶體對齊。面試官:好的。那你知記憶體對齊的原則是什麼,為什麼要記憶體對齊?
二師兄:額。。。應該需要以8位對齊吧。。。不是很清楚為什麼要記憶體對齊。
面試官:你知道
sizeof(空結構體)
的結果是多少嗎?二師兄:應該是0吧。
面試官:對只有一個函數的類進行
sizeof
運算結果是多少?二師兄:應該也是0?
面試官:好的,回去等通知吧。
讓我們復盤以下今日二師兄的表現。
記憶體對齊的原則是什麼,為什麼要記憶體對齊?
主要有以下原則:
- 結構體變數的首地址是其最寬基本成員類型大小的整數倍。
- 結構體每個成員相對於結構體首地址的偏移量都是成員大小的整數倍。
- 結構體的總大小為結構體最寬基本成員類型大小的整數倍。
因為性能。為了緩存友好(Cache friendly)。這是一個很大的話題,咱們今天聊不了太多。
sizeof(空結構體)
的結果是多少?
這裡在C中是0,在C++中是1。C++標準規定,不同的對象不能擁有相同的記憶體地址。 如果空類大小為0,類的對象數組中的每個對象都擁有了相同的地址,這顯然是違背標準的。
對只有一個函數的類進行
sizeof
運算結果是多少?
這裡也是一個坑。要看這個函數是不是虛函數。如果不是虛函數,則結果是1,如果是虛函數,則大小是4或者8。
聰明的小伙伴,提到4或者8.就應該知道是怎麼回事了吧?
好了,今日份面試到這裡就結束了,小伙伴們,對於今天二師兄的面試,能打幾分呢?如果是你,以上的問題都能回答的上來嗎?
關註我,帶你21天“精通”C++!(狗頭)