结构体struct 内存分配规则及地址运算3——编译器优化

结构体struct内存优化3——编译器优化

#include 
#include  // including uint32_t ... 

typedef struct  {
    uint8_t      cap_id                                  ;     // cap object id
    uint16_t     frame_id                                ;     // frame id
    uint32_t     frame_size                              ;     // frame size by byte   
    uint8_t      frame[10]                               ;     // frame 
    uint16_t*    p_frame_id                                ;     // frame
} mem, *pmem ;


#pragma pack(1) // 要求编译器,结构体按照1字节对齐
typedef struct  {
    uint8_t      cap_id                                  ;     // cap object id
    uint16_t     frame_id                                ;     // frame id
    uint32_t     frame_size                              ;     // frame size by byte   
    uint8_t      frame[10]                               ;     // frame 
    uint16_t*    p_frame_id                                ;     // frame
} mem_t, *pmem_t ;
#pragma pack()


int main() {

    mem a;
    mem_t b;
    // pmem pa = 0;
    printf("*******test 1********\n");
    printf("%u %u\n", sizeof(a), sizeof(b) );

    return 0;
}

编译并运行,结果: 32 25
两个结构体完全一样,但是内存分配的大小却不一样。
32的结果是因为没有对编译器做优化,那么编译器会按照默认的struct内存分配规则来进行内存分配;可以参考之前blog:结构体struct 内存分配规则及地址运算

而如果在结构体定义前加上了 #pragma pack(n) 的语句,就是告诉人为告知编译器使用何种内存分配规则,n就是按照 n字节对齐,这里我写得是1,就是按照1字节对其,那么就不会内存填充, 因此计算规则:

uint8_t + uint16_t + uint32_t + 10 * uint8_t + (uint16_t*) // 我是64位操作系统,指针变量内存大小是8字节

1 + 2 + 4 + 10 × 1 + 8 = 25 1+2+4+10 \times 1 + 8 = 25 1+2+4+10×1+8=25

因此最后大小为25字节。

你可能感兴趣的:(c++,c语言)