私は過去に組み込みシステムのプロジェクトに取り組み、スタック変数の宣言の順序を再配置して、結果の実行可能ファイルのサイズを小さくしました。たとえば、次のような場合:
void func()
{
char c;
int i;
short s;
...
}
これを次のように並べ替えます。
void func()
{
int i;
short s;
char c;
...
}
アラインメントの問題により、最初のものでは 12 バイトのスタック スペースが使用され、2 番目のものでは 8 バイトしか使用されませんでした。
これは C コンパイラの標準的な動作ですか、それとも私たちが使用していたコンパイラの欠点ですか?
必要に応じて、コンパイラはスタック変数を並べ替えて、実行可能サイズを小さくすることができるようにすべきだと私には思えます。C標準のいくつかの側面がこれを妨げていることが示唆されていますが、どちらにしても信頼できるソースを見つけることができませんでした.
おまけの質問ですが、これは C++ コンパイラにも当てはまりますか?
編集
答えが「はい」の場合、C/C++ コンパイラはスタック変数を再配置できます。確実にこれを行うコンパイラの例を挙げていただけますか? これを裏付けるコンパイラのドキュメントまたは同様のものを見たいと思います。
再編集
助けてくれてありがとう。ドキュメントについては、2003 年の GCC サミット議事録で発表された Naveen Sharma と Sanjiv Kumar Gupta による論文Optimal Stack Slot Assignment in GCC (pdf)を見つけることができました。
ここで問題となっているプロジェクトは、ARM 開発に ADS コンパイラを使用していました。そのコンパイラのドキュメントには、ARM-Thumb アーキテクチャがローカル スタック フレームでアドレスを計算する方法により、私が示したような宣言の順序付けによってパフォーマンスとスタック サイズが向上することが記載されています。そのコンパイラは、これを利用するためにローカルを自動的に再配置しませんでした。ここにリンクされている論文によると、2003年現在、GCCはスタックフレームを再配置してARM-Thumbプロセッサの参照の局所性を改善していませんが、可能であることを暗示しています.
これが GCC で実装されたことを明確に示すものは何も見つかりませんが、この論文は、あなたがすべて正しいという証拠として数えられると思います。再度、感謝します。