3

考虑以下两个结构:

struct A
{
    // A bunch of standard layout data
};

struct B:public A
{
    // Other data
};

和一个对象

B foo;

假设 sizeof(A) 在编译器之间没有差异,打包是相同的,并且 B 不添加任何虚拟方法,当使用 gcc 或 msvc 编译 Windows x86 或x86-64平台?

编辑:我认为实现继承的最佳方法是将 A 放在 B 之前。否则,向上转换将需要将 this 指针偏移 sizeof(B) ,这很愚蠢。至少 GCC 将 B 的内容放在 A 的内容之后。

4

2 回答 2

2

x86_64架构是个问题,GCC和MSVC选择了不同的内存模型。GCC 是 LP64,MSVC 是 LLP64。换句话说,long类型在 GCC 中是 64 位,在 MSVC 中是 32 位。

问题中的“相同地址”非常模棱两可,但如果 A 和 B 不是由同一个编译器编译,显然你会遇到问题。在这种情况下,不同的包装也可能是一个问题。从同样的歧义进行插值,如果 B 包含任何虚拟成员而 A 不包含,则 A 和 B 的布局不兼容。B 将插入 v-table 指针。

于 2013-01-03T07:48:11.260 回答
1

汉斯正确地解释了一切。一般的答案是否定的。对于任何类/编译器等,这不会开箱即用。

尽管如此。C++ 具有类#pragma pack中的对齐记录等功能。所有这些东西都是用于生成所需或预定义的内存布局。如果你会小心使用它们(也许也有一些#ifdefs),你会得到你想要的兼容性。这被用于大量项目并且有效。

但是您仍然必须仔细检查您使用的每个编译器的布局。

于 2013-01-03T10:31:33.003 回答