2016-03-28 7 views
1

他の投稿でこの問題について書きました。これはそうではありませんが。GCC __attribute__((aligned(8)))not working

GCCコンパイラのバージョン:4.8.3(ARM用)

コードの抜粋:

uint8_t data[4] __attribute__ ((aligned (8))) = {1,2,3,4}; 

int main() 
{ 
    uint32_t p = 0; 
    p = (uint32_t)&data[0]; 
    p = (uint32_t)&data[1]; 
    p = (uint32_t)&data[2]; 
    p = (uint32_t)&data[3]; 
} 

それはませあるのでデータは、任意の関数の外にあることに注意してくださいスタックに割り当てられます。

(デバッグ時)私はpのために見ていた結果は次のとおりです。すべてのヘルプははるかに高く評価されるだろう536870912, 536870920, 536870928, 536870936

:私はこのような何かを期待してい536870912, 536870913, 536870914, 536870915;

+0

配列の個々の要素は、定義によって 'sizeof(T)'離れています。 –

+0

@Matはいこれは私が期待することです。 – Hairi

+0

@Oliver Charlesworth次に、これらの要素を複数のアドレスに割り当てることができます。 – Hairi

答えて

1

の配列をに8バイトの境界に揃えるようにコンパイラに指示しています。 各メンバーはではありません。単純な答えは - スカラーデータ型ではできません。なぜなら、コンパイラは配列要素の間にパディングを置くことができないからです(結局のところ、*x++はuint8_tへのポインタとしてポインターを1だけインクリメントする必要があります)。

struct alignas(8) AL_BYTE{ 
    uint8_t theByte; 
} 
struct AL_BYTE data[4] __attribute__ ((aligned (8))) = {{.theByte=1},.... 

よう

何かがあなたが望むものを達成する必要があります。

0

私はaligned (..)を使って、各項目の代わりに配列全体を整列させます。

標準では、配列要素間の追加のパディング(配列のサイズ==各項目のサイズ*項目の量)を禁じています。

各要素を8バイト境界で揃えたい場合は、要素を8バイト大きくする必要があります。

可能な解決策(__attribute__ ((aligned (8)))と組み合わせる):

  • 構造体の配列(struct {uint64_t byte, padding[7];};)。
  • uint64_tの配列(各番号の最下位バイトのみを使用する必要があります)。これは、lil-endianプラットフォームでのみ正しく動作します。
  • uint8_tという配列で、実際に必要なサイズの8倍です(もう一度、必要なバイトだけを使用する必要があります)。
-1

可能な解決策は、いくつかの詳細があってもよいdemoed here

typedef char AlignedChar __attribute__ ((aligned (8))); 

AlignedChar test[16]={}; 

//prog.c:4:1: error: alignment of array elements is greater than element size 

、残念ながらGCCでは動作しない新しいタイプのうちのアレイを作る次に、新しいタイプに配向してtypedefcharでありますコメントの中で見つけたthis question

しかし、これはclangで動作します。 clangの動作は、sizeofを新しいタイプに変更して、アライメントを含めることです。

私はこれをGCCバグとみなし、70407というバグレポートを提出しました。

+0

'typedef'が単純なデータ型の配列を配列内で変更できるようにするのが好きであるかどうかは本当に分かりません。私はそれが正しいか間違っていると言っているわけではありません、私は十分な基準に精通していません。構造体のようなユーザー定義のデータ型は、私は一般的にはうまくいますが、あなたの例のようなスカラーデータ型 - それは私にかゆみを与えます。..... – tofro

+0

使い方のひとつは 'sizeof'as"スカラーの場合は "size valid"を指定します。 – tofro

+0

@tofro標準の 'sizeof'によると、確かに" size used "です。 – user3528438