看了VC Blog的Constant-Folding之後,測試一下VC2012,GCC和Clang對最佳化的演繹程度為何。
比較基準,未開最佳化(VC是/Od,而GCC/Clang是-O0),跟第二級最佳化(/O2和-O2)
第一個範例
1 | int main() { return 7 + 8; } |
不果是VC2012,GCC或是Clang都會直接將eax填入15,無論有沒有開最佳化。這邊的最佳化不需要後端Codegen的幫忙。
第二個範例
1 | int bump(int n) { return n + 1; } |
在未開最佳化的情況,VC產生的Assembly Code像這樣
1 | mov ecx, 6 |
而最佳化的Assembly Code則是
1 | mov eax, 10 |
這邊需要後端Codegen的幫忙,才能在編譯的時刻得到常數值。
而GCC跟Clang的表現也差不多,最大的差別是Intel語法跟AT&T對組合語言的表示方式不同。
未最佳化版本
1 | movl $6, %edi |
最佳化版本
1 | movl $10, %eax |
在這種最簡單的最佳化大家都有一樣的能力,接著可以看其他部分的差異。