結構體對齊及#pragma詳細解釋

在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

相關文章
相關標籤/搜索