有关struct的sizeof题

shpanghao 2011-05-05 05:55:47
struct st{
int i;
short s;
char c;
};
问 sizeof(st)为多少?
能否详细讲解下,机器采用x86系列。这一类的问题有什么参考资料可看的?《c编程语言》包括国内的书也都没有相关介绍
...全文
287 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
screwzm 2011-05-06
  • 打赏
  • 举报
回复
我观察发现,在vs下如果下一个成员和上一个成员类型一致而且能放入则不开辟新内存,不一致的话则一定会开辟一块新的内存!开辟新的内存长度为成员类型最大的长度!
如在vs可以验证:
struct str
{
char i:3;
unsigned short k:5;
char j:4;

unsigned long m:9;
};

长度为16!
screwzm 2011-05-06
  • 打赏
  • 举报
回复
struct str
{
char i:3,
char j:4,
unsigned short k:5,
unsigned long m:9,
};

gcc下的大小是4,vs下是8!
囧!
我理解应该是4!
求详解!
ljt3969636 2011-05-06
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 anyidan 的回复:]

引用 11 楼 ljt3969636 的回复:
C/C++ code

“size 最大的是short,其长度为2 字节,因而结构体中的char 成员a、c 都以2 为单位对齐”这句我认为就不对。
我了解的规则是:
没有#pragma pack情况下:
结构体内部成员要按自己大小整数倍存字节,成员全对齐后结构体再以自身内部最大成员整数倍对齐自己
例子:
struct str
{……
[/Quote]

struct naturalalign
{
char a;
short b;
char c;
};

这个是6根据我上面说的我是这么认为的:
0 a
1 对齐(因为b两字节对齐)
2 b
3 还是b
4 c
5 对齐(因为naturalalign最大元素为2,要2字节对齐)
所以共计6字节..
dianyancao 2011-05-06
  • 打赏
  • 举报
回复
一個副本方便異常挽救
AnYidan 2011-05-06
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 ljt3969636 的回复:]
C/C++ code

“size 最大的是short,其长度为2 字节,因而结构体中的char 成员a、c 都以2 为单位对齐”这句我认为就不对。
我了解的规则是:
没有#pragma pack情况下:
结构体内部成员要按自己大小整数倍存字节,成员全对齐后结构体再以自身内部最大成员整数倍对齐自己
例子:
struct str
{
char i;
char……
[/Quote]

我也认为应当以 compiler 所有 data type 中的 size 最大者为对齐的最小单位,但 vs2010 中确实为 6, 谁能解释一下?
就想叫yoko 2011-05-06
  • 打赏
  • 举报
回复
++[Quote=引用 19 楼 zhao4zhong1 的回复:]

不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
[/Quote]
lingxiu0613 2011-05-06
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 zhao4zhong1 的回复:]

不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
[/Quote]

++
aa_niaofang 2011-05-06
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 zhaopeng026 的回复:]

struct st{
int i;
short s;
char c;
};
sizeof(st)为 8,
i占4B,s和c一起占4B
[/Quote]

编译器查到s时 后面的对于编译器来说是未知的 他不知道s后面是否有字节继续 填补来达到与i
对齐,如果s与i对调 编译器查到i时 s对于编译器是已知的 s与i之间存在"漏洞"(自定义),而且漏洞不可能通过下面的字节填补所以会填补,有点像 编译原理上面的 语法分析器, 最后所以对其完 编译要检查结构总字节是否是结构成员最大的成员变量的字节的倍数 如果是则结束 如果不是则要在结构末尾再添加字节数 来达到这个要求。至于结构套结构 或者 套联合 貌似对于编译器来说 忽略掉子 结构和联合 具体我也没研究 但目前自认为编译器 是一步一步来对其 而非 先遍历完再对其的
当然 这仍是自己的YY 至于编译器采取的什么方法 我不清楚 不过自己的方法百试不爽呀 吼吼
nemo 2011-05-06
  • 打赏
  • 举报
回复
struct st{
int i;
short s;
char c;
};
sizeof(st)为 8,
i占4B,s和c一起占4B
aa_niaofang 2011-05-06
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 zhao4zhong1 的回复:]

不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
[/Quote]

三星帝 给点实际的吧 看你回帖真蛋疼
aa_niaofang 2011-05-06
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 anyidan 的回复:]

引用 11 楼 ljt3969636 的回复:
C/C++ code

“size 最大的是short,其长度为2 字节,因而结构体中的char 成员a、c 都以2 为单位对齐”这句我认为就不对。
我了解的规则是:
没有#pragma pack情况下:
结构体内部成员要按自己大小整数倍存字节,成员全对齐后结构体再以自身内部最大成员整数倍对齐自己
例子:
struct str
{……
[/Quote]

可以当编译器 是从结构体成员一个一个 对其 不是先遍历整个结构再从中找 而是成员1,到成员2 看是否要内存对其,需要则对其不需要继续向下

比如
struct a{
char s;
char c;
usigned short b;
};

sizeof(a)=4;而不是 6;

编译器检测到b时看上面 的偏移是否是b的整数倍 若是则无需对其 ,当然如果把b改成int型则 sizeof(a)=8;编译器是在 c与b之间添加字节 来达到对其的目的,而不是12,理由同上 ,个人理解 供参考。
赵4老师 2011-05-06
  • 打赏
  • 举报
回复
不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
七夜未央 2011-05-06
  • 打赏
  • 举报
回复
8个字节

我记得前几天也有人问内存对齐的问题

我还举例解释过,LZ可以静下心来仔细琢磨下

这类问题都是纸老虎
shpanghao 2011-05-06
  • 打赏
  • 举报
回复
一定会开辟?太武断了吧
如:
struct s2
{

short k:5;
char i:3;
char j:4;

int m:9;

};
结果是8
ljt3969636 2011-05-05
  • 打赏
  • 举报
回复

“size 最大的是short,其长度为2 字节,因而结构体中的char 成员a、c 都以2 为单位对齐”这句我认为就不对。
我了解的规则是:
没有#pragma pack情况下:
结构体内部成员要按自己大小整数倍存字节,成员全对齐后结构体再以自身内部最大成员整数倍对齐自己
例子:
struct str
{
char i;
char j;
unsigned short k;
double m;
char n;
};
cout<<sizeof(str)<<endl;
str s;
s.i='c';
s.j='b';
s.k=2;
s.m=3;
s.n='d';


偏移 存的成员
0 i
1 j
2 k
3 还是k//
4 对齐
5 对齐
6 对齐
7 对齐
8 m
9 还是m
...
15 还是m
16 n 到此17字节,之后要调整为结构体内部最大成员整数倍,以下补齐7个字节
17 补齐
...
23 补齐
共计24字节
环境vc2008SP1

如果2010不是这样还请告诉我,交流下~~~
老邓 2011-05-05
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 ljt3969636 的回复:]

看了下laodeng粘贴过来的说的有问题...
[/Quote]
哪里有问题?
我都验证过的,VC10SP1。
niaojuuu 2011-05-05
  • 打赏
  • 举报
回复
编译选项中可以选择几字节对齐。一般就是网络通信的时候要特别注意,最好1字节对齐
qq120848369 2011-05-05
  • 打赏
  • 举报
回复
结果是8,每个成员需要对齐,最终结构体的总大小也要对齐,对齐规则参考百度文库.
ljt3969636 2011-05-05
  • 打赏
  • 举报
回复
看了下laodeng粘贴过来的说的有问题...
shpanghao 2011-05-05
  • 打赏
  • 举报
回复
十分感谢1楼,1楼主要思想在于:首先找最大字节单元,找到后便从头到尾开始按照最大字节单元申请空间存放。应该是这个道理吧
加载更多回复(5)

69,373

社区成员

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

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