发觉VC++编译器一个严重的错误,请大侠们解释。
//小弟有以下一段程序,发觉输出的结果不同,不知是编译器的问题,还是别的原因,恳请大侠们解答。
#include<iostream.h>
class compel
{
private:
char aa[100];
int a;
double b;
};
class compel2
{
private:
char aa[100];
double b;
int a;
};
int main()
{
cout<<"compel="<<sizeof(compel)<<endl;
cout<<"compel2="<<sizeof(compel2)<<endl;
return 0;
}
问题点数:100、回复次数:18Top
1 楼rtdb(东临碣石)回复于 2003-11-03 12:12:48 得分 10
是字节对齐导致的输出不同。
下次请不要用“发觉VC++编译器一个严重的错误”这种标题。
Top
2 楼kngpm584(飞翔的野蛮人)回复于 2003-11-03 12:13:16 得分 20
这不是编译器出了问题,而是结构体内部数据成员对齐不同造成的差别。不妨参阅msdn,在查询中输入#pragma,再找pack。Top
3 楼houdy(致力于图像/图形领域,成为有思想的程序员)回复于 2003-11-03 12:22:54 得分 5
以上正解,可以结贴了。。。Top
4 楼fierygnu(va_list)回复于 2003-11-03 12:35:36 得分 1
呵呵,吓了一跳。Top
5 楼shishiXP(诗人XP)回复于 2003-11-03 12:39:33 得分 1
接分 !Top
6 楼flyelf(空谷清音)回复于 2003-11-03 13:05:21 得分 1
upTop
7 楼leyt(思维机器)回复于 2003-11-03 13:17:00 得分 1
吓了一小跳,原来虚惊一场Top
8 楼eboson(无境阁主)回复于 2003-11-03 13:18:45 得分 1
标题挺能吸引眼球Top
9 楼bing_huo(我是一个演员!)回复于 2003-11-03 13:20:34 得分 1
upTop
10 楼williamVII(spread)回复于 2003-11-03 13:29:30 得分 9
建议楼主去看一下<Inside C++ Object Model>
好像是第三章开头就说了.Top
11 楼Bandry(菜鸟-舍我其谁)回复于 2003-11-03 13:44:16 得分 1
楼主搞清楚再说,还发现×××了,有问题就提,没必要搞这种标题,哗众取宠!Top
12 楼yjh1982(血精灵)回复于 2003-11-03 13:45:02 得分 1
唉Top
13 楼Wolf0403(废人:独活十年~心如刀割)回复于 2003-11-03 13:51:45 得分 1
是不是新人都喜欢一惊一诈?呵呵。前面 n 多帖子讨论过这个问题了,建议斑竹删帖示警。
关于内存对齐,老大应该整理一个专题或者精华出来了,呵。最近研究这个的很多嘛Top
14 楼jeckyz(深圳)回复于 2003-11-03 13:55:29 得分 20
字节对齐是根本原因,不同的编译输出的结果也不大一样(在默认选项下),不过根本上还是会遵循字节对齐规则. 在VC环境下,非抽象的空类大小为 1(C++标准如此),如
class A { };
class B { };
class C : A, B { };
你试着用 g++, BC, VC 作个比较 :), 对结果不要太惊讶.其实你刻意去改动对齐方式,结果也不一样,你也可以尝试以 1, 2, 4, 8, 16 看看.Top
15 楼Hot_Forever(用钱砸死我吧)回复于 2003-11-03 14:13:41 得分 20
试着分析一下:
第一个sizeof=112没啥可说的,100个char=100+1个int=104+1个double=112
第二个还是比较有意思的
因为按照一般的理解,应该是char[100]=100,1个double=8,然后底下的int和上面对齐,也等于8,于是应该是116
,不过VC比较怪,它上面的char[100]分配了104个字节,为啥呢,我觉得是一开始4个4个4个
然后到最后了还剩4个了,要和下面的8个字节的double对齐,又补了4个,于是结果居然是
120,呵呵
我想这个具体编译器的实现有关了,
我在DEV-C++和CBuilder5下结果同上Top
16 楼jeckyz(深圳)回复于 2003-11-03 14:15:15 得分 5
其实项目开发的时候很容易出现这种问题的,特别是进行数据处理的时候.大家可能都只用C++(更贴切地说或者是只用VC), 假如是在一个运用多种语言多人合作的开发项目的 project team 里面,如果这种事情出现在自己身上,可真算丢人.我就有过这样的经历, 当时我是用C++来解释其他人用 delphi 做的数据,他们一个 byte 不差地把数据做好了, 然而我在 EVC 里用结构来处理它们,好像一切很好,但最终是打开内存监视一个 byte 一个 byte 刻对才知道症结所在,真可谓记忆犹新!
Top
17 楼lovenoend(有容乃大)回复于 2003-11-06 18:20:07 得分 1
UpTop
18 楼qufan(打死不回头)回复于 2003-11-06 21:51:21 得分 1
upTop




