位域对齐

ithiker 2013-07-25 11:55:35
被人问到,下面的代码

//#pragma pack(1)
#include<stdio.h>
int main()
{
struct A
{
unsigned char a:1;
unsigned char b0:2;
unsigned char e:6;
unsigned char f:4;
unsigned char k;
unsigned char f2:4;
unsigned long int n;
}m;
printf("sizeof(m)=%d,sizeof(long)=%d\n",sizeof(m),sizeof(long));
return 0;
}

在64bit机器上,按照1字节对齐为12
按照4字节对齐也为12.
个人理解:
1字节对齐:
a,b0(1字节)+e(1字节)+f(1字节)+k(1字节)+f2(1字节)+n(8字节)=13字节
4字节对齐:
a,b0(1字节)+e(1字节)+f(1字节)+k(1字节)+f2(1字节+补3字节)+n(8字节)=16字节
为什么都是12?
...全文
143 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
max_min_ 2013-07-26
  • 打赏
  • 举报
回复
struct A
    {
    unsigned char a:1;
    unsigned char b0:2;   
    unsigned char e:6;
    unsigned char f:4;
  // 上面部分占2个字节
    unsigned char k;
   // 占一个字节
    unsigned char f2:4;
   // 占一个字节,还有四个预留位
    unsigned long int n;
     }m;

这个应该和操作系统的是32位还是64位没有关系吧?
很直观啊,一个字节占8位
橡木疙瘩 2013-07-26
  • 打赏
  • 举报
回复
e和f都没有单独占用一个字节,而是a、b0、e、f、k、f2共同占用四个字节(因为它们的长度总和<=32)。 位域这种东西最好少用,因为它们的存储方式是“由实现定义的”,使用整数类型和移位操作符、位逻辑操作符来实现同样的功能会更可靠。
ithiker 2013-07-26
  • 打赏
  • 举报
回复
sizeof(unsigned long int)=8
ksjxqy 2013-07-26
  • 打赏
  • 举报
回复
按1字节对齐,应该是9吧。楼主是否搞错了?
ksjxqy 2013-07-26
  • 打赏
  • 举报
回复
楼主请看看sizeof(unsigned long int)是多少吧!
ksjxqy 2013-07-26
  • 打赏
  • 举报
回复
位域有时还是挺方便的吧,就是此处这个定义太蛋疼了。

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧