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