某日二師兄參加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++!(狗頭)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/554763.html
標籤:其他
上一篇:Rust - 介面設計建議之靈活(flexible)
下一篇:返回列表
