疑惑不解:这两个类的sizeof大小为何不同

林初茵 2008-03-29 11:29:01
class B
{
private:
bool m_bTemp;
int m_nTemp;
bool m_bTemp2;
};

class C
{


private:
int m_nTemp;
bool m_bTemp;
bool m_bTemp2;
};


cout << sizeof(B) << endl;
cout << sizeof(C) << endl;
...全文
276 31 打赏 收藏 举报
写回复
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiqing_gao 2008-04-01
  • 打赏
  • 举报
回复
赫赫,学习~~~
raobaggio 2008-04-01
  • 打赏
  • 举报
回复
听说过,没见过,今天学会了!
zyustc 2008-03-31
  • 打赏
  • 举报
回复
12和8,对起问题,一个单位只能被放在能整除该单位大小的起始地址,然后总大小再对起
skyerfree 2008-03-31
  • 打赏
  • 举报
回复
受教……
iwantfat 2008-03-31
  • 打赏
  • 举报
回复

//采用
#pragma pack(1) //单字节对齐

#pragma pack() //恢复原来的对齐方式

这一般在头文件中用到

fengying616 2008-03-31
  • 打赏
  • 举报
回复

#include <iostream>

#define offsert(type,m_mem) (unsigned long)(&(((type*)0)->m_mem))

class B{
public:
bool m_bTemp;
int m_nTemp;
bool m_bTemp2;
};

class C{
public:
int m_nTemp;
bool m_bTemp;
bool m_bTemp2;
};

using namespace std;
int main(int argc, char** argv){
cout<< sizeof(B) <<endl;
cout<< sizeof(C) <<endl;
cout<< "类B的个成员的内存结构:\n";
cout<< "member\t\taddress offsert\n";
cout<< "bool m_bTemp\t\t" << offsert(B, m_bTemp) << endl;
cout<< "int m_nTemp\t\t" << offsert(B, m_nTemp) << endl;
cout<< "bool m_bTemp2\t\t" << offsert(B, m_bTemp2) << endl;

cout<< "类C的个成员的内存结构:\n";
cout<< "member\t\taddress offsert\n";
cout<< "int m_bTemp\t\t" << offsert(C, m_nTemp) << endl;
cout<< "bool m_nTemp\t\t" << offsert(C, m_bTemp) << endl;
cout<< "bool m_bTemp2\t\t" << offsert(C, m_bTemp2) << endl;

}



运行结果:
12
8
类B的个成员的内存结构:
member address offsert
bool m_bTemp 0
int m_nTemp 4
bool m_bTemp2 8
类C的个成员的内存结构:
member address offsert
int m_bTemp 0
bool m_nTemp 4
bool m_bTemp2 5
f22fbi 2008-03-31
  • 打赏
  • 举报
回复
以前只是听说过内存对齐,具体不知道是什么
学习了
sungodyy 2008-03-31
  • 打赏
  • 举报
回复
头回见 ,长见识啊
i_coding 2008-03-31
  • 打赏
  • 举报
回复
这两个类不光是名字不同,其实质也完全不同,不要看到他们的成员都一样,就误认为这个两个类是相等,其实不然。

再加上系统要求内存对齐,所以大小不一样,就不是大惊小怪的事了。
dskgo 2008-03-31
  • 打赏
  • 举报
回复
对于N字节的元素,它的首地址能被N整除,才能获得最好的性能.
这种题经常在程序员招聘笔试中出现,不在于考查理解语言本身和编译器,而在于考查计算机底层机制的理解和设计程序的原则.
houdongfeng 2008-03-31
  • 打赏
  • 举报
回复
¦bool ¦---- ¦---- ¦---- ¦
¦-------int--------- ¦
¦bool ¦---- ¦---- ¦---- ¦

¦-------int--------- ¦
¦bool ¦bool ¦---- ¦---- ¦
gl0312 2008-03-31
  • 打赏
  • 举报
回复
学习了
liveforme 2008-03-31
  • 打赏
  • 举报
回复
内存对齐阿,学习了
zpk1234 2008-03-31
  • 打赏
  • 举报
回复
内存对齐的问题,3楼的解释很不错.

不知道这里是怎么样画出图来的
lxconan 2008-03-31
  • 打赏
  • 举报
回复
请看:
http://blog.csdn.net/lxconan/archive/2007/10/15/1825759.aspx
:)
wpflyshinerocks 2008-03-31
  • 打赏
  • 举报
回复
画的真好。大家说的都很到位 。。
Kratos 2008-03-31
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 Mnky 的回复:]
C/C++ code¦bool¦----¦----¦----¦
¦-------int---------¦
¦bool¦----¦----¦----¦

¦-------int---------¦
¦bool¦bool¦----¦----¦
[/Quote]
受教了!
milaoshu2 2008-03-31
  • 打赏
  • 举报
回复
字节对齐问题,放成员变量的时候尽量将占字节shao
的成员往前面放
Mnky 2008-03-29
  • 打赏
  • 举报
回复

¦bool¦----¦----¦----¦
¦-------int---------¦
¦bool¦----¦----¦----¦

¦-------int---------¦
¦bool¦bool¦----¦----¦
Mnky 2008-03-29
  • 打赏
  • 举报
回复
去搜“字节对齐”。
|bool|----|----|----|
|-------int---------|
|bool|----|----|----|

|-------int---------|
|bool|bool|----|----|
加载更多回复(11)
相关推荐
发帖
C++ 语言

6.3w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
帖子事件
创建了帖子
2008-03-29 11:29
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下