C++ 标准(引自草案 n3242)对子对象 [intro.object] 有以下说明:
除非对象是位域或大小为零的基类子对象,否则该对象的地址就是它占用的第一个字节的地址。既不是位字段也不是零大小的基类子对象的两个不同对象应具有不同的地址。
现在,给定以下代码段:
struct empty { };
struct member: empty { };
struct derived: empty { member m; };
int main(void)
{
printf("%d", sizeof(derived));
return 0;
}
我相信 gcc 会打印出来2
,Visual C++ 2010 会打印出来1
。我怀疑 gcc 采用标准意味着如果类型的存储代表不同的对象,则不能为它们的存储设置别名。我敢打赌,MSVC 采用的标准意味着如果一个子对象的大小为零,你可以做任何你想做的事情。
这是未指定的行为吗?