1

次のC++コードについて考えてみます。

struct X
{
        int a;
        int b;
};

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

ここで、このコードがサードパーティアプリケーションによって使用される共有ライブラリに配置されていると仮定します。

私の質問は次のとおりです。X(たとえばint c)の最後に別のメンバーを追加し、で初期化するとfoobar()、を呼び出す既存のアプリケーションはfoobar()壊れますか?これは、ソースの互換性ではなく、バイナリの互換性に関するものであることに注意してください。

4

2 に答える 2

3

これは、コンパイラが何を選択するか (より具体的には、プラットフォーム ABI が何を指示するか) に完全に依存します。

戻り値がスタックに置かれると、呼び出し元が期待するよりも多くの書き込みがスタックに書き込まれ、結果として何かがスタンプされる可能性があることが想像できます。

一般に、特定の動作に依存するべきではありません。クライアント アプリケーションを再コンパイルするだけです。唯一の現実的な代替手段は、PIMPL イディオムのようなものです。

于 2011-06-08T16:28:56.117 に答える
3

Xのサイズが変わるので、はい。配列などはサイズによって異なります。「運が良ければ」、パディングにより古いアプリが新しいライブラリを使用できるようになるかもしれませんが、それは純粋な運です。

于 2011-06-08T16:29:21.880 に答える