在linux下c語言結構體對齊:node
1.天然對齊linux
struct 是一種複合數據類型,其構成元素既能夠是基本數據類型(如int、long、float 等)的變量,也能夠是一些複合數據類型(如array、struct、union 等)的數據單元。對於結構體,編譯器會自動進行成員變量的對齊,以提升運算效率。缺省狀況下,編譯器爲結構體的每一個成員按其天然對界(natural alignment)條件分配空間。各個成員按照它們被聲明的順序在內存中順序存儲,第一個成員的地址和整個結構的地址相同。
天然對界(natural alignment)即默認對齊方式,是指按結構體的成員中size 最大的成員對齊。注:這裏的最大指整形數據,實型,結構體成員不在此例。windows
2.#pragma pack(n) 告訴編譯器按照n個字節進行對齊spa
#include <stdio.h> #include <stdlib.h> #include <string.h> #pragma pack(1) typedef struct NODE { int a; double b; char d[11]; long e; long long f; short g; float h; long double i; long int j; char *c; }Node; #pragma pack() int main() { Node *node; node = malloc(sizeof(Node)); memset(node,0,sizeof(Node)); printf("int sizeof a = %lu\n",sizeof(node->a)); printf("double sizeof b = %lu\n",sizeof(node->b)); printf("char * sizeof c = %lu\n",sizeof(node->c)); printf("char sizeof d = %lu\n",sizeof(node->d)); printf("long sizeof e = %lu\n",sizeof(node->e)); printf("long long sizeof f = %lu\n",sizeof(node->f)); printf("short sizeof g = %lu\n",sizeof(node->g)); printf("float sizeof h = %lu\n",sizeof(node->h)); printf("long double sizeof i = %lu\n",sizeof(node->i)); printf("long int sizeof j = %lu\n",sizeof(node->j)); printf("total size = %lu\n",sizeof(Node)); return 0; }
上面程序不包含pragram(1)的輸出結果是code
包含pragra(1)的輸出結果是blog
結果分析:內存
type | 字節 | without-pragma | with-pragma | ||
a | int | 4 | 8 | 4 | |
b | double | 8 | 8 | 8 | |
c | char * | 1 | 8 | 1 | |
d | char[] | 11 | 16 | 12 | |
e | long | 8 | 8 | 8 | |
f | long long | 8 | 8 | 8 | |
g | short | 2 | 8 | 1 | |
h | float | 4 | 8 | 4 | |
i | long double | 16 | 16 | 16 | |
j | long int | 8 | 8 | 8 | |
total | 70 | 96 | 77 |
是在windows環境下配置的cygwin,因此對齊方式則是以最大的內置類型的字節數對齊,因此默認爲8,有#pragma pack(1) ,那麼其默認對齊方式是1個字節。編譯器
若有不對--請糾正!string