結構體記憶體對齊
結構體記憶體對齊規則
- 第一個成員在與結構體變數偏移量為0的地址處。
- 其他成員變數要對齊到某個數字(對齊數)的整數倍的地址處。
對齊數 = 編譯器預設的一個對齊數 與 該成員大小的較小值。
VS中預設的值為8 - 結構體總大小為最大對齊數(每個成員變數都有一個對齊數)的整數倍。
- 如果巢狀了結構體的情況,巢狀的結構體對齊到自己的最大對齊數的整數倍處,結構體的整
體大小就是所有最大對齊數(含巢狀結構體的對齊數)的整數倍。
接下來我們用幾個例子來計算一下結構體的大小吧
程式碼一
struct ps {
char s1;
int s2;
char s3;
};
int main(){
printf("%d\n", sizeof(struct ps));
system("pause");
return 0;
}
執行結果為:
12
我們再在紙上詳細畫出它的過程
程式碼二
int main()
{
struct stu{
char s1;
short s2;
double s3;
float s4;
short s5;
double s6;
char s7;
};
printf("%d", sizeof(struct stu));
system("pause");
return 0;
}
執行結果
40
修改預設對齊數
使用#pragma pack(),可以修改預設對齊數
這裡我們把對齊數修改為1來看看執行結果
int main()
{
struct stu{
char s1;
short s2;
double s3;
float s4;
short s5;
double s6;
char s7;
};
printf("%d", sizeof(struct stu));
system("pause");
return 0;
}
執行結果為
26
相關文章
- c 結構體記憶體對齊詳解結構體記憶體
- C++ struct結構體記憶體對齊C++Struct結構體記憶體
- C結構體中資料的記憶體對齊問題結構體記憶體
- 記憶體對齊記憶體
- 從 CPU 角度理解 Go 中的結構體記憶體對齊Go結構體記憶體
- struct結構體大小的計算(記憶體對齊)Struct結構體記憶體
- GO 記憶體對齊Go記憶體
- 理解記憶體對齊記憶體
- C++ 記憶體對齊C++記憶體
- 記憶體位元組對齊記憶體
- 關於記憶體對齊記憶體
- iOS 記憶體位元組對齊iOS記憶體
- c語言記憶體對齊C語言記憶體
- 由結構體對齊所引發的對C++類物件記憶體模型的思考(一)結構體C++物件記憶體模型
- 由結構體對齊所引發的對C++類物件記憶體模型的思考(二)結構體C++物件記憶體模型
- 記憶體結構記憶體
- iOS探索 記憶體對齊&malloc原始碼iOS記憶體原始碼
- C/C++記憶體對齊詳解C++記憶體
- C/C++記憶體對齊原則C++記憶體
- Oracle體系結構之-記憶體結構Oracle記憶體
- Oracle記憶體體系結構Oracle記憶體
- PostgreSQL:記憶體結構SQL記憶體
- oracle 記憶體結構Oracle記憶體
- JVM記憶體結構JVM記憶體
- 結構體成員對齊的問題結構體
- 【基礎篇記憶體結構】oracle10g記憶體結構(一)記憶體Oracle
- Oracle體系結構:記憶體結構和程式結構(轉)Oracle記憶體
- MySQL整體架構與記憶體結構MySql架構記憶體
- Oracle體系結構之記憶體結構(SGA、PGA)Oracle記憶體
- oracle 記憶體結構(二)Oracle記憶體
- 調節記憶體結構記憶體
- Oracle 記憶體結構(一)Oracle記憶體
- ORACLE 記憶體結構理解.Oracle記憶體
- Netty原始碼解析 -- 記憶體對齊類SizeClassesNetty原始碼記憶體
- Slab: 保證JVM的堆記憶體對齊JVM記憶體
- C語言:記憶體位元組對齊詳解C語言記憶體
- C/C++—— 記憶體位元組對齊規則C++記憶體
- oracle 記憶體結構具體解釋Oracle記憶體