Evans_Y 2023-03-19 21:13 采纳率: 100%
浏览 40
已结题

C语言 __attribute__ ((packed)) 使用

C语言使用__attribute__ ((packed))
测试的struct 占用字节大小感到挺奇怪, 不能理解 (详细见图)

软件: Dev 5.6.3
编译: TDM-GCC 4.8.1 32

源代码:

#include <stdio.h>

typedef struct 
{
    char A; //1
    int B; //4
    char C; //1
    double D; //8
    char E; //1

}__attribute__ ((packed)) StructA;

struct StructB
{
    char A;
    int B;
    char C;
    double D;
    char E;
}; 

int main(void)
{

    StructA StructAExample;
    struct StructB StructBExample;
    
    printf("short 占用的字节 %d \n", sizeof(short));
    printf("int 占用的字节 %d \n", sizeof(int));
    printf("double 占用的字节 %d \n", sizeof(double));
    printf("StructA 占用的字节 %d \n", sizeof(StructAExample));
    printf("StructB 占用的字节 %d \n", sizeof(StructBExample));

    return 0;
}

img

  • 写回答

3条回答 默认 最新

  • Evans_Y 2025-06-05 08:33
    关注

    实际在内存中占用的大小如下: 4+4+8+8+1 = 25 Byte
    与未使用 attribute ((packed))相比 只优化了最后一个char类型的填充

    typedef struct 
    {
        char A; //4 Byte
        int B;    //4 Byte
        char C; //8 Byte
        double D; //8 Byte
        char E; //1 Byte
    }__attribute__ ((packed)) StructA;
    

    改用下列写法:

    typedef struct __attribute__((packed))
    {
        double D; //8
        int B; //4
        char A; //1
        char C; //1
        char E; //1
    }StructA;
    

    实现只占用8+4+1+1+1 = 15Byte大小

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 6月13日
  • 已采纳回答 6月5日
  • 创建了问题 3月19日