C 面試題之sizeof面試題

2021-07-07 03:51:20 字數 1971 閱讀 9055

//sizeof面試題1.cpp

//what is the output of the following code?

//[美國某著名計算機軟硬體公司面試題]

#include

#include

#include

using namespace std;

structa;

structb;

int main()

//解析:

//ss1是乙個字元指標,指標的大小是乙個定植,就是4。

//q2裡面有乙個"/n","/n"算做一位,所以它的空間大小是3。

//a 和b是兩個結構體。在預設情況下,為了方便對結構體內元素的訪問和管理,當結構體內的元素的長度都

//小於處理器的位數的時候,便以結構體裡面最長的資料元素為對齊單位,也就是說,結構體的長度一定是

//最長的資料元素的整數倍。如果結構體內存在長度大於處理器位數的元素,那麼就以處理器的位數為對齊

//單位。但是結構體內型別相同的連續元素將在連續的空間內,和陣列一樣。

////結構體a中有3個short型別變數,各自以2位元組對齊,結構體對齊引數按預設的8位元組對齊,則a1、a2、a3都

//取2位元組對齊,sizeof(a)為6,其也是2的整數倍。b中a1為4位元組對齊,a2 為2位元組對齊,結構體預設對齊引數

//為8,則a1取2位元組對齊;結構體大小6位元組,6不為4的整數倍,增加到8時,符合所有條件,則sizeof(b)為8。

////cpu的優化規則大致原則是這樣的:對於n位元組的元素(n=2,4,8,...) ,它的首位址能被n整除,才能獲得最好的

//效能。設計編譯器的時候可以遵循這個原則:對於每乙個變數,可以從當前位置向後找到第乙個滿足這個條件

//的位址作為首位址。例子比較特殊,因為即使採用這個原則,得到的結果也應該為6(long的首位址偏移量0000

//,short首位址偏移量0004,都符合要求)。但是結構體一般會面臨陣列分配的問題。編譯器為了優化這種情況,

//乾脆把它的大小設為8,這樣就沒有麻煩了,否則的話,會出現單個結構體的大小為6,而大小為n的結構體

//陣列大小卻為8*(n-1)+6的尷尬局面。ibm出這道題並不在於考查理解語言本身和編譯器,而在於應聘者對

//計算機底層機制的理解和設計程式的原則。也就是說,如果讓你設計編譯器,你將怎樣解決記憶體對齊的問題。

//sizeof面試題2.cpp

//what is the ouput of the following code?

//[德國某著名電子/通訊/it企業2023年11月面試題]

#include

using namespace std;

class a;

class a2;

struct b;

struct c;

struct d;

int main()

;class a2;

class a3;

class a4;

class a5;

int main()

//這是用vc編譯後的執行結果:

// 0x0012ff7c

// 0x0012ff7b

// 0x0012ff80

//變數在記憶體中的順序:b(1位元組)--a(4位元組)--c(4位元組)。

//這是用dev c++編譯後的執行結果:

// 0x0022ff7c

// 0x0022ff7b

// 0x0012ff74

//變數在記憶體中的順序:c(4位元組)--中間相隔3位元組--b(佔1位元組)--a(4位元組)。

//這是用lcc編譯後的執行結果:

// 0x0012ff6c

// 0x0012ff6b

// 0x0012ff64

//變數在記憶體中的順序:同上。

//三個編譯器都做到了資料對齊,但是後兩個編譯器顯然沒vc「聰明」,讓乙個char佔了4位元組,浪費記憶體。

from: 

C 面試題之i 面試題

i 面試題1.cpp 中國台灣某著名防毒軟體公司2005年10月面試題 int i 3,j 4 i?i j printf d d n i,j a.3 3 b.4 4 c.3 4 d.4 3 答案b i 面試題2.cpp 中國某著名計算機金融軟公司2005年面試題 int x 1,j 2 int k ...

sizeof面試題選

sizeof面試題選 linux c程式設計實戰 結構體和共用體的記憶體分配是c語言的乙個難點,也是面試題中的熱點。示例1 union data1 sizeof union data1 的值為16.在編譯器預設設定的情況下,該共用體最大基本型別為double,它佔8位元組,所以此共用體以8來對齊。字...

C語言面試題之華為面試題

1 區域性變數能否和全域性變數重名?答 能,區域性會遮蔽全域性。要用全域性變數,需要使用 區域性變數可以與全域性變數同名,在函式內引用這個變數時,會用到同名的區域性變數,而不會用到全域性變數。對於有些編譯器而言,在同乙個函式內可以定義多個同名的區域性變數,比如在兩個迴圈體內都定義乙個同名的區域性變數...