【发布时间】:2011-12-07 07:03:38
【问题描述】:
C++ 标准(引自草案 n3242)对子对象 [intro.object] 有如下说明:
除非对象是位域或零基类子对象 大小,该对象的地址是它的第一个字节的地址 占据。既不是位域也不是基础的两个不同对象 大小为零的类子对象应具有不同的地址。
现在,给定以下 sn-p:
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 采用的标准是,如果一个子对象的大小为零,你可以做任何你想做的事情。
这是未指定的行为吗?
【问题讨论】:
-
哪个版本的 gcc?当
member设置为char时,gcc 4.7 在此处输出 1。 -
@envu,另一个SDK指定的版本。
-
如果成员有不同的类型(空和字符),他们可以有相同的地址。如果它们属于同一类型,则不能,因为这会破坏对象身份的测试,例如
if (this != &that)。 -
我认为 Bo Persson 是对的。据我所知,VC 的行为不符合规定。 N3290 10/8 和 C++03 10/7 说:
two subobjects that have the same class type and that belong to the same most derived object must not be allocated at the same address -
@BoPersson,你能回答一下吗?鉴于 10/8 的措辞,我认为这是最恰当的解释。
标签: c++ standards unspecified-behavior