結構體記憶體對齊
結構體記憶體對齊規則
- 第一個成員在與結構體變數偏移量為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++ struct結構體記憶體對齊C++Struct結構體記憶體
- c 結構體記憶體對齊詳解結構體記憶體
- struct結構體大小的計算(記憶體對齊)Struct結構體記憶體
- 記憶體對齊記憶體
- C結構體中資料的記憶體對齊問題結構體記憶體
- 從 CPU 角度理解 Go 中的結構體記憶體對齊Go結構體記憶體
- GO 記憶體對齊Go記憶體
- 理解記憶體對齊記憶體
- C# 記憶體對齊C#記憶體
- iOS 記憶體位元組對齊iOS記憶體
- C語言記憶體對齊C語言記憶體
- 記憶體結構記憶體
- 探索 Go 語言中的記憶體對齊:為什麼結構體大小會有所不同?Go記憶體結構體
- iOS探索 記憶體對齊&malloc原始碼iOS記憶體原始碼
- C/C++記憶體對齊原則C++記憶體
- C/C++記憶體對齊詳解C++記憶體
- JVM記憶體結構JVM記憶體
- PostgreSQL:記憶體結構SQL記憶體
- Netty原始碼解析 -- 記憶體對齊類SizeClassesNetty原始碼記憶體
- MySQL整體架構與記憶體結構MySql架構記憶體
- C/C++結構體對齊測試C++結構體
- JVM記憶體結構、Java記憶體模型和Java物件模型JVM記憶體Java模型物件
- 理解JVM(一):記憶體結構JVM記憶體
- JVM(七):JVM記憶體結構JVM記憶體
- JVM記憶體結構劃分JVM記憶體
- Postgresql資料庫體系結構-程式和記憶體結構SQL資料庫記憶體
- Dig101:Go 之聊聊 struct 的記憶體對齊GoStruct記憶體
- 記憶體對齊巨集定義的簡明解釋記憶體
- C語言中結構體struct的對齊問題C語言結構體Struct
- STM32記憶體結構介紹和FreeRTOS記憶體分配技巧記憶體
- JVM學習(一)——記憶體結構JVM記憶體
- Oracle OCP(39):Database 記憶體結構OracleDatabase記憶體
- JVM之記憶體結構詳解JVM記憶體
- JVM及其記憶體結構劃分JVM記憶體
- 【JVM】堆體系結構及其記憶體調優JVM記憶體
- netcore高階知識點,記憶體對齊,原理與示例NetCore記憶體
- Go plan9 彙編:記憶體對齊和遞迴Go記憶體遞迴
- JVM的基本結構和JVM的記憶體結構JVM記憶體