【发布时间】:2012-12-15 01:30:56
【问题描述】:
我有一个没有数据的类如下
class A {};
我用它来定义一个对象
A a;
我认为对象“a”有一个地址,对吧?它会占用一些内存吗?如果有,占用多少字节?
如果对象“a”的类型为 void,会发生什么。非常感谢!
【问题讨论】:
标签: c++
我有一个没有数据的类如下
class A {};
我用它来定义一个对象
A a;
我认为对象“a”有一个地址,对吧?它会占用一些内存吗?如果有,占用多少字节?
如果对象“a”的类型为 void,会发生什么。非常感谢!
【问题讨论】:
标签: c++
我认为对象“a”有一个地址,对吧?它会占用一些内存吗?如果有,占用多少字节?
IIRC 标准要求每个对象都有一个地址,并且对象的最小大小(由 sizeof 返回)为 1。话虽如此,优化器可能会使该变量消失(也许除非您明确要求地址)。
除非它是位域 (9.6),否则最衍生的对象应具有非零大小并应占用一个或多个字节的存储空间。基类子对象的大小可能为零。 [...]
除非对象是位域或大小为零的基类子对象,否则该对象的地址就是它占用的第一个字节的地址。既不是位域也不是零大小的基类子对象的两个不同对象应具有不同的地址。4
注 4:在“as-if”规则下,允许实现将两个对象存储在同一机器地址或不存储 如果程序无法观察到差异(1.9),则根本对象。
(C++11 §1.8 ¶5-6)
如果对象“a”的类型为 void,会发生什么。
void 不能用于声明变量,因为它是“不完整类型”。
void类型有一组空值。void类型是无法完成的不完整类型。
(C++11 §3.9.1 ¶9)
【讨论】:
理论上,它根本不需要占用任何内存。可以一起优化掉。
sizeof 一个类不能是0,如果这就是你的意思。如果你打印出sizeof(a),你(大部分时间)会得到1(不管它是什么,它都是一个非零值)。
另外,你不能有 void 类型的对象,所以最后一个问题没有意义。
【讨论】: