在linux下c语言结构体对齐:
1.自然对齐
struct 是一种复合数据类型,其构成元素既可以是基本数据类型(如int、long、float 等)的变量,也可以是一些复合数据类型(如array、struct、union 等)的数据单元。对于结构体,编译器会自动进行成员变量的对齐,以提高运算效率。缺省情况下,编译器为结构体的每个成员按其自然对界(natural alignment)条件分配空间。各个成员按照它们被声明的顺序在内存中顺序存储,第一个成员的地址和整个结构的地址相同。
自然对界(natural alignment)即默认对齐方式,是指按结构体的成员中size 最大的成员对齐。注:这里的最大指整形数据,实型,结构体成员不在此例。
2.#pragma pack(n) 告诉编译器按照n个字节进行对齐
#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 ",sizeof(node->a)); printf("double sizeof b = %lu ",sizeof(node->b)); printf("char * sizeof c = %lu ",sizeof(node->c)); printf("char sizeof d = %lu ",sizeof(node->d)); printf("long sizeof e = %lu ",sizeof(node->e)); printf("long long sizeof f = %lu ",sizeof(node->f)); printf("short sizeof g = %lu ",sizeof(node->g)); printf("float sizeof h = %lu ",sizeof(node->h)); printf("long double sizeof i = %lu ",sizeof(node->i)); printf("long int sizeof j = %lu ",sizeof(node->j)); printf("total size = %lu ",sizeof(Node)); return 0; }
上面程序不包含pragram(1)的输出结果是
包含pragra(1)的输出结果是
结果分析:
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个字节。
如有不对--请纠正!