__attribute__
が GNU C プログラムで使用される理由と方法は ?
3 に答える
GCC および GCC 互換コンパイラが使用するものについては、__attribute__
他のほとんどのコンパイラが#pragma
ディレクティブを使用します。
認識されないものの必要な動作は#pragma
それを無視することであるため、GCCのソリューションの方が優れていると思いますが、仕様を理解しないコンパイラを使用するとコンパイルされません__attribute__
-移植する必要があるものがわかるため、一般的にはこれが優れています.
属性指定は、C を使用して指定できないストレージやアラインメントなどの型、データ、および関数の側面を指定するために使用されます。多くの場合、これらはターゲット固有であり、ほとんどの場合、移植性がなく、確かにコンパイラ間で、多くの場合ターゲット間です。コードの正しい機能を使用することが絶対に必要な場合を除いて、それらの使用は避けてください。
1 つの用途は、変数と構造体メンバーにメモリ アラインメントを適用することです。例えば
float vect[4] __attribute__((aligned(16)));
vect
16 バイトのメモリ境界に確実に配置されます。それがgcc-ismなのか、それともより一般的に適用できるのかはわかりません。
コンパイラは通常vect
、4 バイト境界でのみ整列します。16 バイト アラインメントにより、SIMD ロード命令で直接使用できます。128 ビット レジスタにロードすると、加算、減算、内積、およびあらゆる種類のベクトル演算が可能になります。
メモリ マップされたハードウェア レジスタに構造体を直接オーバーレイできるように、アライメントが必要な場合があります。または、ハードウェアがダイレクト メモリ アクセス (DMA) メカニズムを使用して直接書き込むことができるように、位置合わせする必要があります。
なぜCプログラムで使用されるのですか? 移植性を制限するため。
これは 2 つのアンダースコアで始まるため、実装者の名前空間にあります。これは、言語標準によって定義されたものではなく、各コンパイラ ベンダーは任意の目的で自由に使用できます。
編集: GNU C プログラムで使用されるのはなぜですか? これに対処する他の回答を参照してください。