结构体对齐及#pragma详细解释

在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\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)的输出结果是

包含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个字节。

如有不对--请纠正!

posted on 2017-03-22 23:49  `Elaine  阅读(2812)  评论(0编辑  收藏  举报

导航