社区
C++ 语言
帖子详情
为什么同一结构体在不同程序下长度不同??
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编译。。。
声明均为全局声明。
有人遇到相同情况吗???
...全文
358
10
打赏
收藏
为什么同一结构体在不同程序下长度不同??
先上程序: struct CeilBlockInfo { unsigned char type; long x; long y; long begin; int span; }; 按照字节对齐的优化计算方法,其长度应该是:8+4+4+4=20; 但是在我的另一个程序中计算的结果却是18!百思不得其解。。。。 两个程序都运行在WIN7环境下,但一个是MFC,一个是控制台程序。通过VS2010编译。。。 声明均为全局声明。 有人遇到相同情况吗???
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
C语言
结构体
长度
的计算
很多初学者对于
结构体
长度
的计算是毫无头绪,下面的计算方法是我个人简介,仅供参考。 C语言的编译过程是从上到下的。
结构体
某成员的地址偏移量必须为该成员的整数倍,如果不是整数倍,则前面成员变量需要填充。
结构体
最后一个成员所占字节的
长度
=max(所有的成员
长度
)。 下面以一例子来解说: struct abc{char e;int i;char f;int b;char g;...
C# Struct
结构体
里数组
长度
的指定
1 2 3 4 5 6 7 8 9 10 typedefstructPoint{ unsignedshortx; unsignedshorty; }mPoint;//点坐标 typedefstructLine{ ...
结构体
为什么要内存对齐
结构体
为什么要内存对齐为什么要内存对齐对齐规则 为什么要内存对齐 不是所有的硬件平台都能访问任意地址上的数据; 某些硬件平台只能只在某些地址访问某些特定类型的数据,否则抛出硬件异常,及遇到未对齐的边界直接就不进行读取数据了。 为了代码的可移植性,和提升CPU访问内存的效率,所以
结构体
一定要内存对齐。本质:空间换区时间的做法。 从上图可以看出,对应两种存储方式,若CPU的读取粒度为4字节, 那么对于一个int 类型,若是按照内存对齐来存储,处理器只需要访存一次就可以读取完4个字节 若没有按照
(详解)
结构体
和共用体
前言 复习一波
结构体
和共用体,主要是自己忘记了 正文 0.两者最大的区别在于内存的分配
结构体
和共用体的区别在于:
结构体
的各个成员会占用
不同
的内存,互相之间没有影响;而共用体的所有成员占用
同一
段内存,修改一个成员会影响其余所有成员。
结构体
占用的内存大于等于所有成员占用的内存的总和(成员之间可能会存在缝隙),共用体占用的内存等于最长的成员占用的内存。共用体使用了内存覆盖技术,
同一
时刻只能保存...
结构体
定义使用及指针
长度
问题
1.
结构体
定义
C++ 语言
65,212
社区成员
250,514
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章