struct 記憶體對齊規則

2021-06-26 19:08:32 字數 878 閱讀 6409

1 確定資料成員的offset位址

a-----基本資料型別(不包括陣列/struct/class/uinon),起始offset位址,規律如下,sizeof(atom_type)*n (n=0,1,2,3..)

例子:char 0,1,2,3...      int 0,4,8,12...  double  0,8,16,24...

b-----組合資料成員(陣列/struct/class/uinon ),,起始offset位址,規律如下,sizeof{max(atom_type)}*n (n=0,1,2,3...)  也就是成員的子成員中最大的那個,說到底還是依賴於基本資料型別的大小(找到它的所有基本型別,選出最大的)。

例子:char ch[5]; 0,1,2,3...   strcut ss; 0,8,16,24... 

2 計算最終的大小,sizeof() 的時候,內部最大成員的"最寬基本型別成員"的整數倍,不足補齊,

例子 struct a 最寬基本資料型別成員大小為8,則a的大小只能是8的倍數。

#include "stdafx.h"

#include #include using namespace std;

//author: horizon

//date:2023年11月4日 13:22:58

struct c

; struct b

;struct a

; //根據sizeof規則,sizeof(a)為8的倍數,sizeof(a)=64>=57; a的位址範圍0-63

int _tmain(int argc, _tchar* argv)

{ struct a a;

cout<<"sizeof(a): "<

如果任何錯誤的地方請指出,謝謝。

struct記憶體對齊

出於速度和空間的考量,編譯器在實現過程中均會採用對struct內的變數進行記憶體對齊的操作,雖然會有一定的空間浪費,卻可以減少在讀取資料時候的讀取操作。先看下面的例子 struct a int main struct b int main struct b int main struct a str...

struct記憶體對齊

關於c 中的struct記憶體對齊,應該也是初學者比較疑惑的乙個知識點,但是搞清楚之後會發現非常簡單,這裡解釋一下struct記憶體到底怎麼對齊。主要記住以下兩點 1.各成員變數存放的起始位址相對於結構的起始位址的偏移量必須為該變數的型別所占用的位元組數的倍數 2.整個struct的記憶體大小需為s...

struct 記憶體對齊

struct 是一種復合資料型別,其構成元素既可以是基本資料型別 如 int long float 等 的變數,也可以是 一些復合資料型別 如 array struct union 等 的資料單元。對於結構體,編譯器會自動進行成員變數的對齊,以提高運算效率。預設情況下,編譯器為結構體的每個成員按其自...