22

古いシステムでコンパイルされたバイナリを使用して実行することを期待できる c++11 の何かはありますか? c++11 のどの部分が libstdc++.so の一部であり、実際にバイナリにコンパイルされるものをどのように確認できますか? たぶん、私はそのようなことがどのように機能するかを完全には理解していません。c++11 は古いライブラリとの ABI 準拠を破りますか?

わかりやすくするための例:

auto と新しい範囲ベースの for ループを使用するプログラムをコンパイルするとします。これらのことは、古い c++ ランタイムを搭載したシステムで動作するように思われます。これらのマシンで有効な c++ に分解されるためです。ただし、正規表現のようなものを使用すると、ランタイムにないため、古いシステムでは機能しなくなるはずです。

私は自分の理論をまだテストしていません。なぜなら、私は C++11 と互換性のあるコンパイラにアクセスできず、Google 検索も役に立たなかったからです。

4

2 に答える 2

3

この規格は、以前の実装で動作するものについては保証しません。仕様は実装に関する要件を定義し、実装はそれらの要件に準拠するか、準拠しないかのいずれかです。C++11 実装の一部を以前の実装の一部と接合することは、移植性がなく、実際に可能になる可能性は低いです。

標準ライブラリをまったく使用せず、C++11 機能をまったく使用しないプログラムを作成しても、C++03 実装のバイナリとの ABI 互換性がなくなる可能性があります。たとえば、実装者は新しいバージョンを利用して呼び出し規約を変更する可能性があります。そのため、一般に、プログラムをautoや range-for などの機能に限定しても、必ずしも ABI と互換性があるとは限りません。

c++11 のどの部分が libstdc++.so の一部であり、実際にバイナリにコンパイルされるものをどのように確認できますか?

標準ライブラリの一部を使用しない場合でも (ヘッダーを使用しないことでこれを保証できます)、コンパイルされたバイナリが C++11 実装によって提供される実行時サポートを必要としないことは保証されません。ランタイム サポートに依存する言語機能の例として、例外と仮想メンバーがあります。

繰り返しになりますが、C++03 と C++11 の間で ABI が非互換になる可能性があるのは、ランタイム ライブラリのサポートだけではありません。

c++11 は古いライブラリとの ABI 準拠を破りますか?

いいえ、仕様では、C++03 と C++11 の実装が ABI を共有することを妨げるものは何も必要ないと思います。ただし、知りたいのは、古い仕様は十分に厳格で、古い実装には C++11 実装でも共有される可能性のある ABI が必要ですか? 答えもありません。そのため、実装者は C++11 を実装するときに ABI の互換性を失わざるを得なくなる可能性があります。


特定の C++03 および C++11 の実装では、C++11 でコンパイルされたバイナリと C++03 ランタイム サポートの混在について一定の保証が一緒に行われる場合があるため、それを利用できる場合があります。ただし、そのような実装については知りません。

もう 1 つのオプションは、C++11 と C++03 の実装を混在させようとするのではなく、C++11 の実装で自己完結型のバイナリを作成できる可能性があることです (または、少なくとも外部ランタイム サポートを必要としないオペレーティング システムのシステム コール ABI に依存する必要があります。

信頼できる互換性はソース レベルです。C++03 としてもコンパイルされる C++11 プログラム、および C++11 としてもコンパイルされる C++03 プログラムを作成できますが、もちろんこの方法では、C++ 間の最小公分母に制限されます。 03 と C++11、そして恩恵を受けることができる唯一の C++11 機能については、ムーブ セマンティクスです。

于 2014-02-12T18:29:38.367 に答える