2016-05-16 8 views
5

コンパイル時に配列の整列を8にチェックしようとしています。これはコードです:コンパイル時にC配列の整列チェック

// File scope 
uint32_t pool[1024]; 
bool aligned = (((uintptr_t) pool) % 8) == 0; 

このエラーが発生します:イニシャライザ要素は読み込み時に計算できません。しかし、私は4の配列の配列をチェックすると、私はエラーを取得しません。以下のコード:

// File scope 
uint32_t pool[1024]; 
bool aligned = (((uintptr_t) pool) % 4) == 0; 

言語:C

ツールチェイン:アームなし、EABI-GCC

コンパイラオプション:-mcpu =皮質-M3 -mthumb

なぜこの出来事であります?

+0

なぜコンパイル時に完了したと思いますか?あなたが書いた表現はランタイム表現です...何が恋しいのですか? –

+6

コンパイラはおそらく 'pool'に対して4バイトのアライメントを必要としており、整列されたアドレスが使用されていてもアドレスmod 4が0になることを認識するのに十分です。おそらく0か4のどちらかになるアドレスのMOD 8についても同じことは言えません。 –

+0

@TomKarzesありがとう、あなたのコメントは私が探していたものです。 –

答えて

3

コンパイル時には、後でリンカーによって決定されます。コンパイラがリンカーが修正するための初期化値として放出することができる「任意の数を法とする記号のアドレス」には適切な再配置がないので、それはあきらめます。 Tomがコメント内で述べているように、に少なくともリンカが型の最小限必要な配置に違反しないと仮定しているので、その場合は式を最適化することができます。

これをそのまま達成できると思う唯一の方法は、それをextern bool alignedと宣言してから、リンカースクリプトの黒い魔法を使用してリンク時に適切な値を定義することです。

5

あなたが特定のアライメントを強制する必要がある場合は、これは「アーム-なし-EABI-gccの」ツールチェーンのために働くことが報告されています。静的変数のアドレスが知られていない

uint32_t pool[1024] __attribute__((aligned(8)));

+0

これはOPが尋ねることを知らなかった疑問に対する答えになっています。 –

関連する問題