0

C での実装定義の動作の例として。C 標準では、データ型のサイズは実装定義であると述べています。つまり、sizeof(int)実装が定義されているとしましょう。

  1. この実装定義の動作は、size(int)プラットフォームに依存するか、コンパイラ ベンダーによって定義されるか、またはその両方であることを意味しますか?

  2. コードをコンパイルしたら、異なるバージョンのプラットフォームで実行した場合でも、実装の依存関係は適用されますか? あるプラットフォームで実装定義コードをコンパイルし、それを別のプラットフォームで実行すると、パフォーマンスが低下しますか?

4

5 に答える 5

3

この実装で定義された動作は、size(int)がプラットフォームに依存するか、コンパイラベンダーによって定義されるか、またはその両方を意味しますか?

原則として、コンパイラベンダーがその決定を下すことができます。実際には、コンパイラがシステムライブラリを直接呼び出すコードを出力する場合は、システムと同じ「ABI」(アプリケーションバイナリインターフェイス)に従う必要があります。特に、ABIはのサイズを指定しますint。したがって、コンパイラベンダーは、ABIが言うサイズにすることを「決定」します。

複数のプラットフォームとアーキテクチャを対象とするコンパイラは、各プラットフォームの構成の一部として個別に決定を下します。各ターゲットは、「同じコンパイラ」と考えていても、異なるC実装を表します。

intプログラムを実行するOSのサイズとは異なるサイズの準拠C実装を作成できます。人々がそうすることはめったになく、標準ライブラリはシステムコールを行うときに余分なフープを飛び越えなければならないでしょう。これはエミュレーターの一部として役立つ可能性がありますが、「プラットフォーム」はエミュレートされたプラットフォームであり、異なるサイズのintを持つホストプラットフォームではないと合理的に主張するかもしれません。

コードをコンパイルした後、異なるバージョンのプラットフォームで実行した場合でも、実装の依存関係は適用されますか?

sizeof(int)はコンパイル時定数です。これは、コンパイラによって発行されたコードが特定の値をとる可能性があることを意味します。そのバイナリコードは、サイズの異なるプラットフォームの異なるバージョンで正しく実行できませんint

あるプラットフォームで実装定義のコードをコンパイルし、別のプラットフォームで実行すると、パフォーマンスが低下しますか?

それがまったく機能する場合、パフォーマンスが低下すると想定する特別な理由はありません。一般に、あるプラットフォーム向けのバイナリコードは別のプラットフォームでは機能しないため、通常はまったく機能しません(上記を参照)。プラットフォームが十分に類似していて機能する場合は、コンパイラーが1つのプラットフォームに対して行った最適化が、別のプラットフォームではそれほど適切な最適化ではない可能性があります。その場合、パフォーマンスが低下し、修正は、正しい(バージョンの)プラットフォームを対象とするコードを再コンパイルすることです。

これはARMで発生しますが、x86ではそれほど発生しません。過去のさまざまなチップは、本質的に同じ命令セットを提供していましたが、一部のチップの一部の命令は、他の命令と比較して大幅に異なるコストを持っています。命令Xが高速であると想定する最適化は、命令Xが低速である別のチップでの最適化としては不適切である可能性があります。ご想像のとおり、この種の違いは、チップメーカーをコンパイラベンダーにそれほど人気のあるものにするわけではなく、アセンブリプログラマーにもそれほど人気が​​ありません。

于 2012-12-04T09:07:44.673 に答える
3

はい、定義された実装は、プラットフォーム (アーキテクチャ + OS ABI + コンパイラ) に依存することを意味します。

はい、実装で定義された機能は、プラットフォームのバージョンによって異なる場合があります。

于 2012-12-04T07:05:04.180 に答える
2

この実装定義の動作は、size(int) がプラットフォームに依存するか、コンパイラ ベンダーによって定義されるか、またはその両方であることを意味しますか?

C 標準の用語では、実装はコンパイラです。

これは、用語implementationの C 標準からの実際の定義です。

(C99、3.12p1)実装:特定の制御オプションの下で特定の変換環境で実行され、特定の実行環境でプログラムの変換を実行し、関数の実行をサポートするソフトウェアの特定のセット

于 2012-12-04T07:22:08.877 に答える
0

C-標準によると

ISO/IEC 9899:1999 §3.4.1

各実装がどのように選択が行われたかを文書化する、1 つの実装定義の動作未指定の動作`

これは、コンパイラで文書化されている動作が であることを意味しますimplementation defined

sizeof()文書化されています。

2 例 : 実装定義の動作の例は、符号付き整数が右にシフトされたときの上位ビットの伝播です。

附属書 J「移植性の問題」には、未指定の動作 (J.1)、未定義の動作 (J.2)、実装定義の動作 (J.3)、およびロケール固有の動作 (J.4) のリストが含まれています。

于 2012-12-04T07:09:40.183 に答える
0

size(int) は実際には実装に依存します。パフォーマンスとは関係ありませんが、使用しているプラ​​ットフォームのアーキテクチャです。32 ビット幅の CPU は、64 ビット幅の CPU や 16 ビット幅の CPU とは動作が異なります。

それは彼らが主にプラットフォーム依存で言及しているものですが、さらに多くの問題をもたらすクロスコンパイルの問題もあります。-m などのフラグを使用して、コードが最初にコンパイルされたプラットフォームとは異なるプラットフォームで実行されるようにするアーキテクチャと幅を指定できます。

于 2012-12-04T07:09:29.160 に答える