结构体内存对齐 和 #pragma pack()

本文探讨了结构体内存对齐的规则,包括编译器默认的对齐方式和如何通过#pragma pack()设定对齐参数。通过实例展示了不同对齐参数下结构体的内存布局,阐述了结构体嵌套时的对齐策略,并解释了内存对齐对于提高读取效率的重要性。
摘要由CSDN通过智能技术生成

为了保证计算机读取数据的高效性,编译器通常在结构体的成员数据进行内存对齐,使每一个成员变量都对齐在自然边界上,同时也有一定的空间牺牲。

我们重点考虑成员变量是如何对齐的:

对齐规则(偏移规则)

  • 每个成员按照其类型的对齐参数(通常是这个类型的大小)和指定对齐参数(未指定时采用默认值,32位系统通常默认按4字节对齐)中的较小的一个对齐,即min(n,sizeof(type))
  • 结构长度必须为所有使用过的对齐参数中最大对齐参数的整数倍

#pragma pack()改变默认对齐

但是存在有些编译器的默认对齐方式不同,为了保证一致性,我们可以在编
写时采用#pragma pack()来指定对齐参数
用法:

#pragma pack(n)
//c  struct code
#pragma pack()

上面中的c tsruct code段的代码将会以n为指定对齐参数,

实例理解

通过例子理解一下:

/*
64位系统,long所占字节为8 
*/
#include <stdio.h>
#include <stdlib.h>
//#pragma pack(4)
struct A
{
   
    int a1;
    char a2;
    int a3;
    long a4;
    char a5;
};
int main()
{
   
    struct
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值