2016-10-21 4 views
1

他のデータをインターリーブすることなく静的リンケージを使っていくつかのオブジェクトをまとめたいと思います。オブジェクトは別々のソースファイルで定義されています。オーダーは連続している限り重要ではありません(最小/標準のパディングを除く)。多くのターゲットのためのスタティックオブジェクトを一緒にまとめる標準的な方法

のgccで

私は__attribute__((section("mydata")))でこれを達成することができますが、GCC特定とだけ多くのコンパイラがそれをサポートしていますAFAIK(GCC、LLVMといくつか他の人が、私はMSVCではないと思う)、(エルフはい、他の人は私が」わからない、私はそれを疑う)。

Q1:これを実現する標準的な方法はありますか?

Q2:GCCは、オブジェクトがパディングと連続していることを保証しますか?オブジェクトは、一定のストライドを有する線形スキャンによって列挙することができる。

Q3:GCCとこの属性をサポートする他のコンパイラとの間で動作に違いがありますか?

Q4:どのターゲットとメジャーコンパイラがこれをサポートしないのですか?

答えて

1

プラットフォームに依存しないコードを作成しようとしているようです(したがって、標準的なメカニズムが必要です)。ソースにアクセスしている間は、変更を制限したいだけです。あなたが提案している解決策は、複数の翻訳単位で定義されたデータ構造に、単一の配列の要素であるかのようにアクセスすることです。

Q1。 C standardでもC++ standardもリンカセクションの概念を含んでいないので、出力セクション名を指定するための真にプラットフォームに依存しない方法はありません。

ターゲットとする各コンパイラを確認する必要があります。あなたはすでにGCCとClangの呪文を見つけました。 Visual C++には、同じことを達成できる#pragma section__declspec(allocate)があります。

Q2。 GCCは、プラットフォームのリンカを使用して実行可能ファイルを構築します。 GNU環境を想定すると、そのリンカーはbinutils ldまたはgoldになります。これらのリンカでは、各出力セクションは連続しており、出力セクション内の入力セクションのアラインメントはspecifiedであるか、デフォルトにすることができます。ドキュメントによると、同じコンパイラオプションを使用して、すべてのオブジェクトファイルが同じバージョンのGCCでコンパイルされていると仮定すると、デフォルトが動作します。コンパイラオプションが異なると、デフォルトのアライメントが異なる場合があります。

Q3。プラットフォーム上の動作の違いについて:リンカーの使用はかなり異例です。ターゲットとする各プラットフォームを慎重にテストする必要があります。あなたが望むやり方でオブジェクトファイルをまとめる小さなバイナリを構築し、あなたが望む方法でデータ構造にアクセスできることをプログラムでチェックすることをお勧めします。

4。あなたのアプローチは、LinuxのGCC/Clang/binutilsとWindowsのVisual C++/LINKのために働くようです。各プラットフォームの非同期性を学ぶには多少の努力が必要ですが、実際のキーボードを使って1995年以降のプラットフォームについてもアプローチを進めることができます。古いマシンや小型の組み込みシステムでは、問題が発生する可能性があります。あなたはおそらくAndroid上でそれを得ることができます。私はiOSについてはわかりません。

一般的な助言として、データユニットが翻訳ユニットの境界を越えて連続していると仮定してデータ構造にアクセスすることは珍しいことです。あなたは奇妙な問題に遭遇し、助けを得るのが難しいと感じるでしょう。ここではあまりプラットフォームごとの努力で、何をしたいあなたを得る可能性がありますいくつかの代替mechansimsです:

  1. コンパイルの前に一緒にソースファイルを入れて、一つのユニットとして、それらをコンパイルします。手作業で行うことができない場合は、プリプロセッサを使用するか、小さなPerlまたはPythonスクリプトをビルドしてビルド時に実行してください。

  2. 実行時には、メモリの連続セクションを動的に割り当て、データ構造をその領域にコピーします。データ構造が小さい場合、これは余分なメモリを使用しません。データ構造が大きい場合、元の構造体を含むメモリはページアウトされ、余分なメモリはそれほど使用されません。

  3. インダイレクションを使用する:データへのポインタの配列を使用してプログラムにデータ構造にアクセスさせます。

関連する問題