3

私の 32 ビット x86 Ubuntu11.10 では、gcc4.6.3 は引数をスタックで渡します。gcc に引数をレジスタで渡すように強制する gcc の最適化はありますか? そして、gccはどのようにそれを行いますか? 詳細をお願いします。

4

2 に答える 2

6

関連する属性は__attribute__((fastcall)). この属性で宣言された関数は、ECX では最初の有効な引数で、EDX では 2 番目の有効な引数で呼び出されます。

(私はx86を想定しています。32ビットと言いましたが、ARMなどの多くのアーキテクチャをカバーしています)。

于 2012-07-20T08:35:21.940 に答える
3

Linux-x86 ABIがそれを指定しているため、GCCはあなたのケースでスタックに引数を渡します。fastcall 関数属性を使用すると、それを変更できます。これはもちろん ABI を壊し、それが原因であらゆる種類の問題を引き起こします。

解決策は、ABIが(一部の)引数がレジスタによって渡されることを指定しているx86-64に切り替えることです。または、最先端のものが好きなら、新しい x32 ABI は x86-64 ABI に似ていますが、32 ビット ポインターを使用します。

于 2012-07-20T08:28:46.693 に答える