为什么是1 ?

zpk1234 2008-03-14 09:49:15
一个空类A
class A
{};

cout<<sizeof(A);
输出的结果是1,但是每个类都有this指针,而指针的大小是4,那么这里为什么是1呢?请指教啊
谢谢
...全文
133 14 打赏 收藏 举报
写回复
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
zyouhua83 2008-03-18
  • 打赏
  • 举报
回复
理解真好!!!
guanghong 2008-03-18
  • 打赏
  • 举报
回复
如果不是4,怎么会是1呢?
这是编译器的事情
v41dugu 2008-03-18
  • 打赏
  • 举报
回复
编译器干的事情而已..
ttkk_2007 2008-03-15
  • 打赏
  • 举报
回复
插一个char,以区分各个不同的对象
abupie 2008-03-15
  • 打赏
  • 举报
回复
空struct也是如此。
qiuqiu173 2008-03-14
  • 打赏
  • 举报
回复
学习
freshui 2008-03-14
  • 打赏
  • 举报
回复
编译器干的 实现方便
lyle3 2008-03-14
  • 打赏
  • 举报
回复
只知道空类的大小不为1,现在,知道为什么了~
jieao111 2008-03-14
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 coding_hello 的回复:]
考虑一下函数里两个空类对象,如果大小是0,那么这两个对象无法分配地址就明白了。
[/Quote]
: 为了确保两个不同对象的地址不同,必须如此。也正因为如此,new返回的指针总是指向不同的单个对象。我们还是来看代码吧:
class Empty { };

void f()
{
Empty a, b;
if (&a == &b) cout << "impossible: report error to compiler supplier";

Empty* p1 = new Empty;
Empty* p2 = new Empty;
if (p1 == p2) cout << "impossible: report error to compiler supplier";
}


另外,C++中有一条有趣的规则——空基类并不需要另外一个字节来表示:
struct X : Empty {
int a;
// ...
};

void f(X* p)
{
void* p1 = p;
void* p2 = &p->a;
if (p1 == p2) cout << "nice: good optimizer";
}


如果上述代码中p1和p2相等,那么说明编译器作了优化。这样的优化是安全的,而且非常有用。它允许程序员用空类来表示非常简单的概念,而不需为此付出额外的(空间)代价。一些现代编译器提供了这种“空基类优化”功能。



野男孩 2008-03-14
  • 打赏
  • 举报
回复
考虑一下函数里两个空类对象,如果大小是0,那么这两个对象无法分配地址就明白了。
zpk1234 2008-03-14
  • 打赏
  • 举报
回复
多谢jieao111
zpk1234 2008-03-14
  • 打赏
  • 举报
回复
那这个1是怎么出来的?
jieao111 2008-03-14
  • 打赏
  • 举报
回复
一个空类对象的大小是1byte。为什么?那是被编译器安插进去的一个char,这样就使得这个空类的两个objects得以在内存中配置独一无二的地址。只有当一个类为空的时候,编译器才会向该类中加入这样一个char!切记!
jieao111 2008-03-14
  • 打赏
  • 举报
回复
每个类都有this指针
_____________

没听说过啊
发帖
C++ 语言

6.3w+

社区成员

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