#pragma pack記憶體對齊的實現以及相關微軟面試題
什麼是記憶體對齊?
-不同型別的資料在記憶體中按照一定的規則排布
-而不一定是順序的一個接一個的排序
struct Test1
{
char c1;
short s;
char c2;
int i;
};
struct Test2
{
char c1;
char c2;
short s;
int i;
};
sizeof(struct Test1)=?
sizeof(struct Test2)=?
答案是12和8
分析:
為什麼需要記憶體對齊?
-CPU對記憶體的讀取不是連續的,二是分塊讀取的,塊的大小隻能是1、2、4、8、16...位元組
-當讀取操作的資料未對齊,則需要兩次匯流排週期來訪問記憶體,因此效能會大打折扣
-某些硬體平臺只能從規定的相對地址處讀取特定型別的資料,否則產生硬體異常
#pragma pack 用於指定記憶體對齊方式,能夠改變編譯器預設對齊方式
#include<stdio.h>
#pragma pack(4)
struct Test1 //對齊引數 偏移地址 大小
{ //1 0 1
char c1; //2 2 2
short s; //1 4 1
char c2; //4 8 4
int i;
}; //大小為8+4=12
#pragma pack()
#pragma pack(4)
struct Test1 //對齊引數 偏移地址 大小
{ //1 0 1
char c1; //1 1 1
char c2; //2 2 2
short s; //4 4 4
int i;
}; //大小為4+4=8
#pragma pack()
編譯器預設為pack(4)
struct 佔用記憶體大小
-第一個成員起始於0偏移處
-每個成員按其型別大小和pack引數中較小的一個進行對齊
·偏移地址必須能被你對齊引數整除
·結構體成員的大小取其內部長度最大的資料成員作為其大小
-結構體總長度必須為所有對齊引數的整數倍
微軟面試題:
#include<stdio.h>
#pragma pack(8)
struct S1
{ //對齊引數 偏移地址 大小
short a; //2 0 2
long b; //4 4 4
}; //大小4+4=8
struct S2
{ //對齊引數 偏移地址 大小
char c1; //1 0 1
struct S1 d; //4 4 8 //對齊引數為結構體成員長度最大的成員
double e; //8 16 8
}; //大小為16+8=24
#pragma pack()
int main()
{
printf("%d\n",sizeof(struct S1));
printf("%d\n",sizeof(struct S2));
return 0;
}
不同編譯器輸出結果不一樣
gcc編譯器暫時不支援8位元組對齊,輸出結果為20(pack(4))
vs編譯器支援8位元組對齊,輸出結果為8和24
相關文章
- iOS 記憶體管理相關面試題iOS記憶體面試題
- 【編譯製導指令】#pragma pack - 位元組數基準對齊編譯
- 記憶體對齊記憶體
- GO 記憶體對齊Go記憶體
- 理解記憶體對齊記憶體
- 結構體記憶體對齊結構體記憶體
- C# 記憶體對齊C#記憶體
- 1分鐘瞭解C語言正確使用位元組對齊及#pragma pack的方法C語言
- C結構體中資料的記憶體對齊問題結構體記憶體
- iOS 記憶體位元組對齊iOS記憶體
- C語言記憶體對齊C語言記憶體
- iOS RunLoop 總結以及相關面試題解答iOSOOP面試題
- 惡意軟體開發——記憶體相關API記憶體API
- 軟體測試相關概念以及原則(一)
- project中的堆疊記憶體,記憶體地址引用,gc相關問題Project記憶體GC
- 關於JVM 記憶體的 N 個高頻面試問題!JVM記憶體面試
- QT 出現 warning: unterminated #pragma pack (push, ...) at end of file 問題的解決方案QT
- [leetcode/lintcode 題解] 微軟 面試題:實現 Trie(字首樹)LeetCode微軟面試題
- Go高效能程式設計-瞭解記憶體對齊以及Go中的型別如何對齊保證Go程式設計記憶體型別
- C++ struct結構體記憶體對齊C++Struct結構體記憶體
- c 結構體記憶體對齊詳解結構體記憶體
- 記憶體優化相關記憶體優化
- 集合相關面試題面試題
- ES相關面試題面試題
- FLume相關面試題面試題
- [20191220]關於共享記憶體段相關問題.txt記憶體
- struct結構體大小的計算(記憶體對齊)Struct結構體記憶體
- golang的記憶體相關內容Golang記憶體
- iOS探索 記憶體對齊&malloc原始碼iOS記憶體原始碼
- C/C++記憶體對齊原則C++記憶體
- C/C++記憶體對齊詳解C++記憶體
- JavaScript變數,資料和記憶體的相關問題JavaScript變數記憶體
- [20241021]使用gdb檢視修改記憶體地址以及相關值.txt記憶體
- Netty原始碼解析 -- 記憶體對齊類SizeClassesNetty原始碼記憶體
- 面試遇到的redis相關問題面試Redis
- Dig101:Go 之聊聊 struct 的記憶體對齊GoStruct記憶體
- 記憶體對齊巨集定義的簡明解釋記憶體
- [20191223]關於共享記憶體段相關問題3.txt記憶體