我有以下代码
class nest_empty
{
class empty{};
};
nest_empty
的大小是否为1(在我的实现sizof空类是1)?如果是,为什么? nest_empty
可以被视为空类吗?
修改
class nest_empty
{
class empty{};
empty d;
};
nest_empty
的大小是否仍为1?如果是,为什么?
答案 0 :(得分:6)
您的第一个nest_empty
版本是一个空类(没有非静态数据成员,也没有非空基础),因此如果它们在实现中的大小为1,则其大小为1。
“为什么”是因为空类的实现大小为1,而这又是因为它们的大小不能为0(标准禁止它),而您的实现者选择了1。
你的第二个nest_empty
不是一个空类(它有一个非静态数据成员)。它可以合法地具有大小1,因为它唯一的非静态数据成员d
是类型empty
,这是一个空类,因此可能是大小为1。
但是我不能告诉你它实际上是否会在你的实现上有1号。问你的编译器。
答案 1 :(得分:3)
是。 empty
位于nest_empty
。
为了更清楚,行class nest_empty{};
只是定义nest_empty
。它没有在empty
中声明任何成员。
答案 2 :(得分:3)
sizeof(nest_empty)
并非强制要求为1,但它不会为零。
$ 9.3说:Complete objects and member subobjects of class type shall have nonzero size.
这是必需的,因为如果您创建一个nest_empty
数组,则每个数组必须具有与另一个不同的地址。
修改强>
最有可能的是,sizeof(nest_empty)
会在两个版本中产生相同的结果,但并非强制要求。标准所说的唯一的事情就是空类的大小会非零。