インテル® C++ コンパイラー 18.0 デベロッパー・ガイドおよびリファレンス

不要な 16 バイト・アライメントの回避

これは、よく理解している特定の状況でのみ使用すべきです。このオプションでビルドされていないほかのオブジェクトやライブラリーとリンクすると、正当性の問題が発生する可能性があります。このトピックは、IA-32 アーキテクチャー・ベースの Linux* システムにのみ適用されます。

32 ビットの Linux* ABI では、スタックは 4 バイト・アライメントのみ維持する必要があるとしています。しかし、最近のアーキテクチャーのパフォーマンス上の理由から、GCC と ICC はスタック上で 16 バイト・アライメントを維持します。16 バイト・アライメントを維持するには、関数のエントリーについてスタックを調整するため、追加の命令が必要になります。これは、コードサイズに影響し、特に小さなルーチンを多く含むコードに大きく影響します。

一部のケースでは、コンパイラー・オプションを指定することで、4 バイト・アライメントを維持するように ICC を戻して、追加のスタック調整命令を排除することができます。

このオプションは、次のいずれかに該当する場合のみ使用します。

指定するオプション:

Linux*: -falign-stack=assume-4-byte
macOS*: なし
Windows*: なし

メリット

  • 16 バイト・アライメントが不要な場合、その維持に必要な追加の命令が不要になるため、コードサイズが小さくなります。

  • 命令が減ることで、一部のケースではパフォーマンスが向上します。

デメリット

16 バイトでアライメントされたスタックに依存するほかのオブジェクトやライブラリーとリンクする場合、互換性の問題が生じることがあります。

注:

コードの特性によっては、このオプションはバイナリーサイズを増加させることがあります。