web-dev-qa-db-ja.com

__attribute__ in GNU C

理由と方法は__attribute__ GNU Cプログラム?

48
sud03r

GCC属性:

  • 説明されている関数属性 ここ
  • 説明されている変数属性 here
  • タイプ属性の説明 here
35
qrdl

GCCおよびGCC互換コンパイラーが___attribute___を使用する場合、他のほとんどのコンパイラーは_#pragma_ディレクティブを使用します。

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

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

27
Clifford

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

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

vectが16バイトのメモリ境界に配置されるようにします。それがgcc-ismであるか、より一般的に適用できるかはわかりません。

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

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

17
George Phillips