質問

例えば、私を宣言するのには長い可変できていると思うのは、いつでも揃えると、"sizeof(long)"境界線?Microsoft Visual C++オンラインヘルプというので、それは標準的に振る舞えるのでしょうか?

一部の詳細情報:

a.が可能でexplicitelyをずれ整数(*バー):

char foo[5]

int*bar=(int*)(&foo[1]);

b.どうやら、#pragma pack()のみに影響する構造物の授業は、組合であったことである。

c.MSVC書るポッドの種類を揃えて、それぞれのサイズがいつでもしくは、デフォルトでは標準の挙動をわかんない)

役に立ちましたか?

解決

と先ほども少し触れましたが、こんの一部には標準ではコンパイラの実装できること、プロセッサます。例えば、VCが容易に行えますの異なる配置に必要な要件ARMプロセッサではx86プロセッサです。

Microsoft VC行うのは基本的にという天然配列のサイズが指定された#pragmaパックディレクティブまたは、/Zpコマンドラインオプションです。これは、例えば、ポッドタイプサイズより小さい値を8バイトに配置に基づき、そのサイズです。も大きくな部隊の中から8バイトの境界線。

が重要である制御配列の異なるプロセッサーの異なるコンパイラでコンパイルしたときに使用梱包サイズ1、パッドだ。

#pragma pack(push)
#pragma pack(1)    
struct Example
{
   short data1;     // offset 0
   short padding1;  // offset 2
   long data2;      // offset 4
};
#pragma pack(pop)

このコードでは、 padding1 変数のみに存在するdata2が自然になっております。

答え:

あることを容易に引き起こすがずれます。るx86プロセッサー、これは当てはまりません本当に痛くなります。その他のプロセッサをするので、この結果、クラッシュまたは非常に遅くなります。例えば、アルファプロセッサーが投げプロセッサの例外を引っ掛けたり、強く引っ張ったと重点が移りつつある。OSのバーしてい検査の命令およびその他の作業が必要なはずれます。その執行が続いています。の __unaligned キーワードに使用できるVCマunalignedアクセスのための非x86プログラム(CE).

他のヒント

デフォルトでは、あります。しかし、変更することができますのpack()#pragma.

とは思っていないのC++の標準を要求て、では実装によって異なる。

CおよびC++な権限のアライメントを実施します。自然なアライメントを強く優先するx86で 必要 ほとんどのその他のCPUアーキテクチャ、コンパイラが一般的に可能な限りの保Cpuます。で実際に使い、コンパイラ生成ずれのデータばかり、ねじったりしないでくださいりません。

あり、すべての種類も揃えられ少なくともその配置条件です。

どうすればできな?

ただし、sizeof()タイプと同じではないでにアライメントを実施します。

可能にするには、以下のマクロ定の配列要件のタイプ:

#define ALIGNMENT_OF( t ) offsetof( struct { char x; t test; }, test )

のコンパイラのpragmasの最適化。現代のコンパイラでコンパイル選択することも可能です。時間や空間の最適化を変えることができる配列の型です。

が一般的ですので読み込みや書き込みができるので早くすることができてうれしいです。がほとんどのコンパイラにスイッチをoffにします。にgccそ-malign-???.との集合体とは、整列、サイズを配列要素。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top