0
次のコードを考えてみましょう。Epb.cc
というファイルに入れます。g ++がepbをプッシュし、最適化レベルを越えて関数の先頭にespを保存するのを防ぐことはできますか?
void f() {
asm("nop");
}
ここでは、さまざまな最適化レベルでコンパイルします。
g++ -c -O0 -o Out0 Ebp.cc
g++ -c -O1 -o Out1 Ebp.cc
g++ -c -O2 -o Out2 Ebp.cc
g++ -c -O3 -o Out3 Ebp.cc
ここにはそれぞれobjdump -d
の出力があります。
$ objdump -d Out*
Out0: file format elf64-x86-64
Disassembly of section .text:
0000000000000000 <_Z1fv>:
0: 55 push %rbp
1: 48 89 e5 mov %rsp,%rbp
4: 90 nop
5: 5d pop %rbp
6: c3 retq
Out1: file format elf64-x86-64
Disassembly of section .text:
0000000000000000 <_Z1fv>:
0: 90 nop
1: c3 retq
Out2: file format elf64-x86-64
Disassembly of section .text:
0000000000000000 <_Z1fv>:
0: 90 nop
1: c3 retq
Out3: file format elf64-x86-64
Disassembly of section .text:
0000000000000000 <_Z1fv>:
0: 90 nop
1: c3 retq
それはすべての最適化レベルを越え、この特定の機能のための3つの追加の命令を追加しないためにg++
を指示することは可能ですか?
@MichaelPetch、これは問題を解決するため、私はこれを答えとして受け入れます。私は単一の機能にしか影響を及ぼさないものを探していましたが、これも同様に機能すると思います。 – merlin2011
実際には、私はあなたがそれを行うための機能レベルの方法を本当に探していたので、投稿した直後にコメントを削除しました。 GCC/G ++では、それを行う関数属性があるのか分かりません。 –
@MichaelPetch、私は、たとえ機能レベルの方法がないとしても、今後この質問を見ている人にとっては、このコメントはまだ価値があると思います。 – merlin2011