10

「aligned(16)」属性を使用して、関数を 16 バイト境界にバイト アラインしようとしています。私は次のことをしました: void __attribute__((aligned(16))) function() { }

(ソース: http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html )

しかし、コンパイルすると (gcc foo.c ; makefile やリンカー スクリプトは使用されません)、次のエラーが発生します。

FOO.c:99: エラー: '関数' にアラインメントが指定されていない可能性があります

4、8、32などにも合わせてみましたが、エラーは同じままです。これは、powerpc ベースのプロセッサの割り込みサービス ルーチンを調整するために必要です。そうする正しい方法は何ですか?

4

3 に答える 3

10

コンパイル時に-falign-functions=16を gcc に渡さないのはなぜですか?

于 2009-12-16T07:14:08.570 に答える
10

この GCC の質問に関する私の回答から適応して、次のように#pragma ディレクティブを使用してみてください。

    #pragma GCC push_options
    #pragma GCC optimize ("align-functions=16")

    //add 5 to each element of the int array.
    void add5(int a[20]) {
        int i = 19;
        for(; i > 0; i--) {
            a[i] += 5;
        }
    }

    #pragma GCC pop_options

およびマクロは、プラグマの効果の範囲を制御するために使用さ#pragma push_optionsれます。これらのマクロの詳細については、GCC ドキュメントを参照してください。pop_optionsoptimize


あるいは、GCC の属性構文を好む場合は、次のようなことができるはずです。

    //add 5 to each element of the int array.
    __attribute__((optimize("align-functions=16")))
    void add5(int a[20]) {
        int i = 19;
        for(; i > 0; i--) {
            a[i] += 5;
        }
    }
于 2013-01-12T14:57:04.773 に答える
2

その属性をサポートしていない古いバージョンのgccを使用している可能性があります。あなたが提供したドキュメントリンクは、gccの「現在の開発」のためのものです。さまざまなリリースを見ると、この属性はgcc4.3以降のドキュメントにのみ表示されます。

于 2009-12-16T08:06:21.237 に答える