zoukankan      html  css  js  c++  java
  • 结构体对齐及#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
    ",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个字节。

    如有不对--请纠正!

  • 相关阅读:
    hdu 3265 Posters(线段树+扫描线+面积并)
    hdu 3974 Assign the task(线段树)
    hdu 1540 Tunnel Warfare(线段树)
    poj 2777 Count Color(线段树(有点意思))
    用Flask+Redis维护Cookies池
    用代理抓取微信文章
    Idea-常用快捷键列表
    用Flask+Redis维护代理池
    Selsnium-Chrome-PhantomJS-爬取淘宝美食
    分析Ajax请求抓取今日头条街拍图片
  • 原文地址:https://www.cnblogs.com/chenyang920/p/6602907.html
Copyright © 2011-2022 走看看