数据结构:有关结构体的几个小问题(#pragma pack(), offsetof宏 )

在提出这几个问题之前,首先应该了解什么是内存对齐

接下来我们就提出几个问题?

  1. 如何设置编译器的默认对齐数?
  2. 如何计算结构体中某变量相对于首地址的偏移量?

解决第一个问题就需要用到指令 #pragma pack ;下面解释一下如何使用它。

1. #pragma pack

#pragma pack 作用:指定结构体、联合以及类成员的packing alignment;

#pragma pack 的语法:

#pragma pack( [show] | [push | pop] [, identifier], n )

#pragma pack( show )//显示当前packing aligment的字节数,以warning message的形式被显示
#pragma pack( push )//将当前指定的packing alignment数值进行压栈操作,这里的栈是the internal compiler stack,同时设置当前的packing alignment为n;如果n没有指定,则将当前的packing alignment数值压栈
#pragma pack( pop)//从internal compiler stack中删除最顶端的record;如果没有指定n,则当前栈顶record即为新的packing alignment数值;如果指定了n,则n将成为新的packing aligment数值;如果指定了identifier,则internal compiler stack中的record都将被pop直到identifier被找到,然后pop出identitier,同时设置packing alignment数值为当前栈顶的record;如果指定的identifier并不存在于internal compiler stack,则pop操作被忽略
#pragma pack( identifier )//当同push一起使用时,赋予当前被压入栈中的record一个名称;当同pop一起使用时,从internal compiler stack中pop出所有的record直到identifier被pop出,如果identifier没有被找到,则忽略pop操作
#pragma pack( n )//指定packing的数值,以字节为单位;缺省数值是8,合法的数值分别是1、2、4、8、16
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值