C ++和二进制兼容性:按值返回POD结构

时间:2011-06-08 16:26:22

标签: c++ binary-compatibility abi

考虑以下C ++代码:

struct X
{
        int a;
        int b;
};

X foobar()
{
        X x = { 1, 2 };
        return x;
}

现在假设此代码放在共享库中,该库由第三方应用程序使用。

我的问题是:如果我在X末尾添加其他成员(例如int c),并在foobar()中对其进行初始化,则会调用foobar()的现有应用程序打破?请注意,这是关于二进制兼容性,而不是源兼容性。

2 个答案:

答案 0 :(得分:3)

这完全取决于你的编译器选择做什么(更具体地说,是ABI所要求的平台)。

你可以想象,如果将返回值放在堆栈上,你现在可以在堆栈上写入比调用者期望的更多的内容,这可能会导致对某些内容进行标记。

通常,您不应该依赖任何特定的行为。您只需重新编译客户端应用程序。唯一现实的替代方案就像PIMPL idiom

答案 1 :(得分:3)

由于X的大小会改变,是的。数组等依赖于大小。你可能会“幸运”,填充可能允许较旧的应用程序使用较新的lib,但这将是纯粹的运气。