77

__attribute__が GNU C プログラムで使用される理由と方法は ?

4

3 に答える 3

37

GCC および GCC 互換コンパイラが使用するものについては、__attribute__他のほとんどのコンパイラが#pragmaディレクティブを使用します。

認識されないものの必要な動作は#pragmaそれを無視することであるため、GCCのソリューションの方が優れていると思いますが、仕様を理解しないコンパイラを使用するとコンパイルされません__attribute__-移植する必要があるものがわかるため、一般的にはこれが優れています.

属性指定は、C を使用して指定できないストレージやアラインメントなどの型、データ、および関数の側面を指定するために使用されます。多くの場合、これらはターゲット固有であり、ほとんどの場合、移植性がなく、確かにコンパイラ間で、多くの場合ターゲット間です。コードの正しい機能を使用することが絶対に必要な場合を除いて、それらの使用は避けてください。

于 2009-09-22T12:26:18.020 に答える
26

1 つの用途は、変数と構造体メンバーにメモリ アラインメントを適用することです。例えば

float vect[4] __attribute__((aligned(16)));

vect16 バイトのメモリ境界に確実に配置されます。それがgcc-ismなのか、それともより一般的に適用できるのかはわかりません。

コンパイラは通常vect、4 バイト境界でのみ整列します。16 バイト アラインメントにより、SIMD ロード命令で直接使用できます。128 ビット レジスタにロードすると、加算、減算、内積、およびあらゆる種類のベクトル演算が可能になります。

メモリ マップされたハードウェア レジスタに構造体を直接オーバーレイできるように、アライメントが必要な場合があります。または、ハードウェアがダイレクト メモリ アクセス (DMA) メカニズムを使用して直接書き込むことができるように、位置合わせする必要があります。

于 2009-09-22T07:24:04.443 に答える
-10

なぜCプログラムで使用されるのですか? 移植性を制限するため。

これは 2 つのアンダースコアで始まるため、実装者の名前空間にあります。これは、言語標準によって定義されたものではなく、各コンパイラ ベンダーは任意の目的で自由に使用できます。

編集: GNU C プログラムで使用されるのはなぜですか? これに対処する他の回答を参照してください。

于 2009-09-22T08:26:23.710 に答える