问个sizeof(struct)的问题

cir2633 2009-08-16 12:14:58
计算某struct之前, 要先计算此struct的对齐字节

1 数据对齐, 是取决于CPU ?还是操作系统 ? 还是编译器?(比如win32的VC,Linux的g++ )
2 一般情况下, 没有明确指定#pragam pack()的情况下 , 默认采用几字节对齐 ? ? 查资料看的话大部分都是以4字节对齐的
3 下面的这个结构体 ,在书上没有提到过,其中的1,5,12这三个数字是什么意思 ?
struct S
{
unsigned int f1 : 1;
unsigned int f2 : 5;
unsigned int f3 : 12;
};
...全文
184 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
ly309431053 2009-08-17
  • 打赏
  • 举报
回复
1:数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储。

2:结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储.(struct a里存有struct b,b里有char,int ,double等元素,那b应该从8的整数倍开始存储.)

3:收尾工作:结构体的总大小,也就是sizeof的结果,.必须是其内部最大成员的整数倍.不足的要补齐.
kakashi0309 2009-08-17
  • 打赏
  • 举报
回复
11楼的错误 怎么是3个字节呢 最少也要4个字节的 本来数据类型就是unsigned int

只不过占用18个bit
cir2633 2009-08-17
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 arnold9009 的回复:]
引用 5 楼 cir2633 的回复:
如果S2的成员类型不是char而是u-int, S2的成员在内存是如何存储的 ? sizeof(S2)是多少呢 ?
struct S2
{
unsigned int f1 : 1; //占用最低字节Byte0的bit0
unsigned int f2 : 5; //占用最低字节Byte0的bit1~bit5
unsigned int f3 : 12;//占用Byte1和Byte2
};


因此sizeof(S2)的大小是3个字节

[/Quote]

在vc上实际是4Byte
cir2633 2009-08-17
  • 打赏
  • 举报
回复
up
cir2633 2009-08-17
  • 打赏
  • 举报
回复
除了和CPU有关, 还和编译器有关
比如vc和gcc上


http://www.diybl.com/course/3_program/c++/cppsl/20090311/160450.html
superbtl 2009-08-16
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 cir2633 的回复:]
如果S2的成员类型不是char而是u-int, S2的成员在内存是如何存储的 ? sizeof(S2)是多少呢 ?
struct S2
{
unsigned int f1 : 1;
unsigned int f2 : 5;
unsigned int f3 : 12;
};
[/Quote]1,5,12都是占用的bit位的大小,也是按照4个字节对齐,最大存储32个bit,如果你大于32个bit就会增加4个字节了
如何存储也看操作系统的大小端。
cir2633 2009-08-16
  • 打赏
  • 举报
回复
如果S2的成员类型不是char而是u-int, S2的成员在内存是如何存储的 ? sizeof(S2)是多少呢 ?
struct S2
{
unsigned int f1 : 1;
unsigned int f2 : 5;
unsigned int f3 : 12;
};
cir2633 2009-08-16
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 supermegaboy 的回复:]

3 下面的这个结构体 ,在书上没有提到过,其中的1,5,12这三个数字是什么意思 ?
---------------------------------------------------------------
那个叫位字段,就是f1这个变量占一个二进制位大小,f2为5个,f3为12个
[/Quote]
比如~
struct S
{
char f1 : 1;
char f2 : 5;
char f3 : 12;
};

sizeof(S)的结果是什么 ?
我的理解是:f1和f2在第一个字节存储,后面带3个位的填充. f3占用两个字节,其中第一个字节填满, 第二个字节的后4位被填充, 所以sizeof(S)=3
不知道这样对不对!
dongming1011 2009-08-16
  • 打赏
  • 举报
回复
好深奥。。帮顶。。
superbtl 2009-08-16
  • 打赏
  • 举报
回复
别的1L给出了
第三个问题 你GOOGLE位域有详细说
飞天御剑流 2009-08-16
  • 打赏
  • 举报
回复
1 数据对齐, 是取决于CPU ?还是操作系统 ? 还是编译器?(比如win32的VC,Linux的g++ )
--------------------------------------------------------------------------
跟cpu有关,字节对齐主要目的就是提高cpu对内存的存取效率。



2 一般情况下, 没有明确指定#pragam pack()的情况下 , 默认采用几字节对齐 ? ? 查资料看的话大部分都是以4字节对齐的
----------------------------------------------------------------------------
默认字节对齐跟编译器有关,例如vc就是4,但tc则是1



3 下面的这个结构体 ,在书上没有提到过,其中的1,5,12这三个数字是什么意思 ?
---------------------------------------------------------------
那个叫位字段,就是f1这个变量占一个二进制位大小,f2为5个,f3为12个
ForestDB 2009-08-16
  • 打赏
  • 举报
回复
[Quote=引用楼主 cir2633 的回复:]
计算某struct之前, 要先计算此struct的对齐字节

1 数据对齐, 是取决于CPU ?还是操作系统 ? 还是编译器?(比如win32的VC,Linux的g++ )
// 个人理解是CPU+OS+Compiler,即个人所理解的所谓的平台(platform)
2 一般情况下, 没有明确指定#pragam pack()的情况下 , 默认采用几字节对齐 ? ? 查资料看的话大部分都是以4字节对齐的
// 4
3 下面的这个结构体 ,在书上没有提到过,其中的1,5,12这三个数字是什么意思 ?
struct S
{
unsigned int f1 : 1;
unsigned int f2 : 5;
unsigned int f3 : 12;
};
// f1占1个bit,f2占5个bit,f3占12个bit
[/Quote]
只有引用的内容不允许回复
Arnold9009 2009-08-16
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 cir2633 的回复:]
如果S2的成员类型不是char而是u-int, S2的成员在内存是如何存储的 ? sizeof(S2)是多少呢 ?
struct S2
{
unsigned int f1 : 1; //占用最低字节Byte0的bit0
unsigned int f2 : 5; //占用最低字节Byte0的bit1~bit5
unsigned int f3 : 12; //占用Byte1和Byte2
};
[/Quote]

因此sizeof(S2)的大小是3个字节
bladesoft 2009-08-16
  • 打赏
  • 举报
回复
1,5,12 个二进制位
  • 打赏
  • 举报
回复
1 数据对齐, 是取决于CPU ?还是操作系统 ? 还是编译器?(比如win32的VC,Linux的g++ )

跟编译器是有关系的。像gcc就优化过的,基本不需要对齐。


http://blog.csdn.net/hairetz/archive/2009/04/16/4084088.aspx
2.默认的位数与int一致吧
nineforever 2009-08-16
  • 打赏
  • 举报
回复
1. 编译器 http://msdn.microsoft.com/en-us/library/83ythb65.aspx
2. 默认是/Zp8 http://msdn.microsoft.com/en-us/library/xh3e3fd0.aspx
3. Bit-field http://msdn.microsoft.com/en-us/library/ewwyfdbe.aspx
ies_sweet 2009-08-16
  • 打赏
  • 举报
回复
1,直接取决于编译器。但是目前的IDE都是软硬件平台兼顾的,
有些CPU强制要求字节对齐,不对齐就会崩溃,而有些CPU只是降低效率而已。

2,一般情况下,是按照“机器字长”对齐,如果是32位机,那就是4字节

3,位段或者位域,其实挺简单也挺复杂的,多上网查些资料

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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