为什么同一结构体在不同程序下长度不同??

y601539388 2012-03-26 02:10:12
先上程序:
struct CeilBlockInfo
{
unsigned char type;
long x;
long y;
long begin;
int span;
};
按照字节对齐的优化计算方法,其长度应该是:8+4+4+4=20;
但是在我的另一个程序中计算的结果却是18!百思不得其解。。。。

两个程序都运行在WIN7环境下,但一个是MFC,一个是控制台程序。通过VS2010编译。。。
声明均为全局声明。

有人遇到相同情况吗???
...全文
265 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Mei 2012-03-26
  • 打赏
  • 举报
回复
直接在每次运行的时候都先执行: sizeof(int); sizeof(long) sizeof(CeilBlockInfo)这样子一目了然了嘛
愤怒的熊猫007 2012-03-26
  • 打赏
  • 举报
回复
在MFC下有可能是按照UNCODE所以unsigned char 是控制台下的两倍。
nice_cxf 2012-03-26
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 virtualdesktop 的回复:]

引用 5 楼 mosal 的回复:

如果都是4字节对齐 自然是20 。不是20绝对编译器有问题。关键是 你确定是4字节对齐么。18只能说是2字节对齐了。我觉得 你只要知道字节对齐的计算方法就够了,用的时候根据自己需求!


...... 在64位系统下面,光sizeof(long)就等于8了,如何“不是20绝对编译器有问题”
楼主的问题,是因为控制台程序在编译时按照16位系统设定……
[/Quote]
如果是你说的,那么你怎么解释结果18?已经说过既然是18,自然long和int必然是4字节,显然是程序在那里设置按2字节对齐了
VirtualDesktop 2012-03-26
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 mosal 的回复:]

如果都是4字节对齐 自然是20 。不是20绝对编译器有问题。关键是 你确定是4字节对齐么。18只能说是2字节对齐了。我觉得 你只要知道字节对齐的计算方法就够了,用的时候根据自己需求!
[/Quote]

...... 在64位系统下面,光sizeof(long)就等于8了,如何“不是20绝对编译器有问题”
楼主的问题,是因为控制台程序在编译时按照16位系统设定进行编译,这个时候sizeof(long)=sizeof(int)=2
mosal 2012-03-26
  • 打赏
  • 举报
回复
如果都是4字节对齐 自然是20 。不是20绝对编译器有问题。关键是 你确定是4字节对齐么。18只能说是2字节对齐了。我觉得 你只要知道字节对齐的计算方法就够了,用的时候根据自己需求!
nice_cxf 2012-03-26
  • 打赏
  • 举报
回复
如果是默认设置,无论int还是long是几个字节,结果都不可能是18
应该是对齐方式被设置为2字节对齐了,没有其他可能
RabbitLBJ 2012-03-26
  • 打赏
  • 举报
回复
应该系统优化了吧,感觉18字节的很奇怪,等高人指点了,帮顶了
y601539388 2012-03-26
  • 打赏
  • 举报
回复
呵呵,谢谢大家热心的解答,我把结构体以二进制输出到文本里,之后用UEDIT查看,发现18是按照二字节对齐的。编译器在usigned char对应的字节后面添加了一个0XCC的值进行了补齐。。。
另外抱歉一点,我书写的问题,是MFC为18位,控制台程序为20位。
现在我在查找为何我的MFC程序会被设置为2字节对齐?。。。。
VirtualDesktop 2012-03-26
  • 打赏
  • 举报
回复
另外,多说一句,int long 的长度都不是固定的,根据你的操作系统的位数而不同,对于32位系统,得到的是20,64位则是40。还有,字节对齐的字节长度也是可调的。所有这些都会影响sizeof的结果。
VirtualDesktop 2012-03-26
  • 打赏
  • 举报
回复
控制台程序按照16位编译,sizeof(int)你看看是不是2

65,186

社区成员

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

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