求sizeof

xgbing
博客专家认证
2011-02-17 03:35:59
struct ss
{
char a;
short b;
double c;
char d;
};

求sizeof

为什么是16,gcc下编译
...全文
324 41 打赏 收藏 转发到动态 举报
写回复
用AI写文章
41 条回复
切换为时间正序
请发表友善的回复…
发表回复
hrx1989 2011-02-19
  • 打赏
  • 举报
回复
gcc编译器能够更加的优化!
赵4老师 2011-02-18
  • 打赏
  • 举报
回复
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编。)
dane_max 2011-02-18
  • 打赏
  • 举报
回复
根据结构体对齐规则, 在32位机器里,机器字长是4, gcc编译器默认是按 4 对齐,但是在里边,char short 变量分别在内存中占 1, 2 字节,那么 就取小对齐, a 可以任意位置对齐, b 按 2*n 的位置对齐,那么 a 和 b 之间就有个 字节空间 空着没用,但是会算结构体的大小, double 是 8 个byte, 但是,超过机器字长,编译器会按机器字长对齐,后面的char 会占一个字节,但是为确保下一个结构体也可以对齐,所以d 后面还空 3 byte 算是该结构体的
内存地址 size
0x00 1 char
0x01 1 空
0x02 2 short
0x04 8 double
0x12 1 char
0x13 3 空
maoloverme1 2011-02-18
  • 打赏
  • 举报
回复
我在运行的时候也是24.是不是LZ的编译器对这个结构进行了优化。如果下面的应该就是16了
struct ss
{
char a;
short b;
char d;
double c;
};
AnYidan 2011-02-18
  • 打赏
  • 举报
回复
记忆力好的,分析逻辑强的。。。我佩服你们
我只是:
管它与什么有关,管它什么编译器
需要的时候在所用的系统下,打开编译器,sizeof 一下,
c_bee 2011-02-18
  • 打赏
  • 举报
回复
是的 lZ的说法不大妥当 应该是跟编译器和机器位宽有关系
sillior 2011-02-18
  • 打赏
  • 举报
回复
32位机器: 需要补齐四位
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---
charshort---~~~~double--------------------------char~~~~~~~~~~~~

~代表自动补齐的位
char a; 和
short b;
占4个字节
double c;
占8个字节
char d;
占4个字节
4+8+4=16

64位机器需要补齐8个字节
上面8不变 4改为8
8+8+8=24
wolaiye_1_3 2011-02-18
  • 打赏
  • 举报
回复
取决于变异器是8字节对齐还是4字节对齐 和编译器设置和类型有关系。
jackiesen 2011-02-18
  • 打赏
  • 举报
回复
这个和操作系统的位数有关。如果你是32位操作系统应该,以8对齐,应该就是 8+8+8=24。
c_bee 2011-02-18
  • 打赏
  • 举报
回复
同意这个观点
[Quote=引用 30 楼 sillior 的回复:]
32位机器: 需要补齐四位
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---
charshort---~~~~double--------------------------char~~~~~~~~~~~~

~代表自动补齐的位
char a; 和
short b;
占4个字节
double……
[/Quote]
-迷糊- 2011-02-18
  • 打赏
  • 举报
回复
VC6.0表示也是24,可以解释。。。
漫步者、 2011-02-18
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 sum212aver 的回复:]
对齐 同补齐的问题 要取绝与是什么系统 ab
a a a<>aa;[]aaaffff m$m
[/Quote].对的
gracedida 2011-02-18
  • 打赏
  • 举报
回复
学习了,得到24
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20101025/22/26d5c57d-08b2-4999-a80c-de03612653b8.html


这个帖子说的很清楚
wxwlll 2011-02-17
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 xgbing 的回复:]
引用 3 楼 justkk 的回复:

1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除
2) 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding)
3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节(trailing padd……
[/Quote]

在VC中的各种类型的数据空间大小都是可以设置的,gcc没用过不太清楚!
wopabe 2011-02-17
  • 打赏
  • 举报
回复
LZ 没有对齐
sum212aver 2011-02-17
  • 打赏
  • 举报
回复
sum212aver 2011-02-17
  • 打赏
  • 举报
回复
对齐 同补齐的问题 要取绝与是什么系统 ab
a a a<>aa;[]aaaffff m$m
pfugwtg 2011-02-17
  • 打赏
  • 举报
回复
sizeof计算结构字节有两种算法,一种是使成员的地址在边界对齐,另一种是使成员的地址在字节边界对齐。
结果为16说明用的是第一种算法,而且你用的电脑是32位(即4字节)机,因此char a;虽为1字节,但因为是字对齐,因此占4字节。同理,short b;(2字节)double c;(4字节)char d;(1字节)各占4字节,故而结果为16字节。
若用第二种算法则为8字节(1+2+4+1=8字节)。
正是因为不同的算法和系统可能导致不同的结果,因此才用sizeof来计算。
justkk 2011-02-17
  • 打赏
  • 举报
回复
不懂 在我的linux环境中
gcc 编译结果也是 24
加载更多回复(15)

69,369

社区成员

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

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