空类所占大小问题

zero_226 2010-07-28 09:02:22
class Test{};
sizeof(Test)为何为1?望高人指教
...全文
371 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
kuangsun 2010-10-03
  • 打赏
  • 举报
回复
学习了!
匪盗84 2010-07-30
  • 打赏
  • 举报
回复
没显示全,说的是20楼的回复有道理 :)
匪盗84 2010-07-30
  • 打赏
  • 举报
回复
这个回复ms才是正解啊 :)

[Quote=引用 20 楼 gingerjws 的回复:]
引用 3 楼 yunyun1886358 的回复:

因为必须用1个byte存放不同对象的地址.使得这个空类的各个objects在内存中有不同的地址.
设想如果为0,则该类的两个对象实例该如何区分?岂不都在内存中的同一个地方?!
例如:class A;(是没有任何成员的空类)
则A a,b;
显然 &a != &b 但是,如果sizeof(A)等于0则无……
[/Quote]
na2650945 2010-07-30
  • 打赏
  • 举报
回复
看过大家的解释。
学习下。
genlic 2010-07-29
  • 打赏
  • 举报
回复
这个真的不好解释了吧....
GingerJWS 2010-07-29
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 yunyun1886358 的回复:]

因为必须用1个byte存放不同对象的地址.使得这个空类的各个objects在内存中有不同的地址.
设想如果为0,则该类的两个对象实例该如何区分?岂不都在内存中的同一个地方?!
例如:class A;(是没有任何成员的空类)
则A a,b;
显然 &a != &b 但是,如果sizeof(A)等于0则无法分配内存来在运行时区分多个同类型的对象。
所以,编译器对这样的类的对……
[/Quote]

UP
因为必须用1个byte存放不同对象的地址说的不准确,不是存放地址,一个字节存地址也不够。

一个类实例必须要占用内存,否则对它取址该返回什么,占一个字节当然是最节省的方案。
zhangweiit 2010-07-29
  • 打赏
  • 举报
回复
There is an interesting rule that says that an empty base class need not be represented by a separate byte:

struct X : Empty {
int a;
// ...
};

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

This optimization is safe and can be most useful. It allows a programmer to use empty classes to represent very simple concepts without overhead. Some current compilers provide this "empty base class optimization".
zhangweiit 2010-07-29
  • 打赏
  • 举报
回复
The reason is the language standard states that all classes must have a memory size of at least 1 byte so that the class doesn't occupy the same memory space with another class

要注意的一点就是
当这个类被用于继承时,他的空间就是0了,
这是多数编译器都实现的优化
zhangweiit 2010-07-29
  • 打赏
  • 举报
回复
Why is the size of an empty class not zero?
To ensure that the addresses of two different objects will be different. For the same reason, "new" always returns pointers to distinct objects.

这是C++之父stroustrup本人的解释
and,他只说,非0
但没说,一定是1
1,4这取决于编译器实现
但至少要有1用来占位
ForestDB 2010-07-29
  • 打赏
  • 举报
回复
个人认为跟实现相关,因为并没用这样的规定,可以看看Inside the C++ Object Model。
匪盗84 2010-07-29
  • 打赏
  • 举报
回复
有个疑问,下面的class A,size为4个字节,那创建对象时,地址存在哪里呢?
class A
{int a;};

[Quote=引用 3 楼 yunyun1886358 的回复:]
因为必须用1个byte存放不同对象的地址.使得这个空类的各个objects在内存中有不同的地址.
设想如果为0,则该类的两个对象实例该如何区分?岂不都在内存中的同一个地方?!
例如:class A;(是没有任何成员的空类)
则A a,b;
显然 &a != &b 但是,如果sizeof(A)等于0则无法分配内存来在运行时区分多个同类型的对象。
所以,编译器对这样的类的对象……
[/Quote]
taotaotheripper 2010-07-29
  • 打赏
  • 举报
回复
至于空类占1字节的原因:
参看http://topic.csdn.net/u/20091114/22/6a4eba99-4562-44c9-8ef0-9565f39fc015.html
我的解释:
空类也要实例化成对象,而对象总要存在内存空间中,C++中内存空间中的变量总要有指针有地址,如果一个对象的大小为0,那根本就没有存到内存中(根本就没有占存储位),怎么返回指针和存储地址,这就会引起问题,所以编译器会加一个变量(比如char)来区分不同的对象。
taotaotheripper 2010-07-29
  • 打赏
  • 举报
回复
1、若类为空类,则占用空间为1字节
2、若不为空类,且没有虚函数,则占用空间为类中声明的数据所占用的空间(就没有空类时的那个1字节了)
3、若有虚函数,类在存储时要保存虚函数指针,一般虚函数指针为4字节
jackyjkchen 2010-07-29
  • 打赏
  • 举报
回复
有些人不懂,有些人背书……

真实的情况是——C++标准并未规定,完全看编译器实现……
zheyimiao 2010-07-28
  • 打赏
  • 举报
回复
this指针是不会占用类对象的内存的, 况且一个字节的东西也不够指针用啊(指针是4个字节)
[Quote=引用 2 楼 yongziqd 的回复:]
类主要是由数据成员占用内存. 如果是空类的话,内存应该是由this指针占用吧.
[/Quote]
ningweidong 2010-07-28
  • 打赏
  • 举报
回复
空类有一个char用来表示不同的对象。不然,生成的对象全都一样了。
yongziqd 2010-07-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 yunyun1886358 的回复:]

因为必须用1个byte存放不同对象的地址.使得这个空类的各个objects在内存中有不同的地址.
设想如果为0,则该类的两个对象实例该如何区分?岂不都在内存中的同一个地方?!
例如:class A;(是没有任何成员的空类)
则A a,b;
显然 &a != &b 但是,如果sizeof(A)等于0则无法分配内存来在运行时区分多个同类型的对象。
所以,编译器对这样的类的对……
[/Quote]每个类都有个默认的this指针吧.
ayw215 2010-07-28
  • 打赏
  • 举报
回复
up、[Quote=引用 3 楼 yunyun1886358 的回复:]

因为必须用1个byte存放不同对象的地址.使得这个空类的各个objects在内存中有不同的地址.
设想如果为0,则该类的两个对象实例该如何区分?岂不都在内存中的同一个地方?!
例如:class A;(是没有任何成员的空类)
则A a,b;
显然 &a != &b 但是,如果sizeof(A)等于0则无法分配内存来在运行时区分多个同类型的对象。
所以,编译器对这样的类的对……
[/Quote]
pengzhixi 2010-07-28
  • 打赏
  • 举报
回复
看深入理解C++对象模型
yunyun1886358 2010-07-28
  • 打赏
  • 举报
回复
给空类的每个对象分配一个字节空间,用来占位。这个字节的地址就是对象的地址
加载更多回复(3)

65,210

社区成员

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

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