在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[];
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,,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 ;
}
上面程序不包含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个字节。
如有不对--请纠正!