最適化

公開:2005-04-21 21:42
更新:2020-02-15 04:36
カテゴリ:c++

何げに、

#include <iostream>
struct A {
A() : _a(10){};
const int a() {return _a;};
void a(const int v) {_a = v;};
private:
int _a;
};
struct B {
B() : _b(10){};
const int b() {return _b;};
void b(const int v) {_b = v;};
private:
int b;
};
void main()
{
A a;
B b;
a.a(20);
b.b(20);
std::cout << a.a() * b_.b() << std::endl;
}


こういうコードを最適化(VC7.1のOxオプション)でコンパイルすると、驚くべきアセンブラソースを吐き出すことがわかりました。

cl test2.cpp /HEa /Ox /FAscした結果出力される.codファイル

_TEXT    SEGMENT
main    PROC NEAR
; 20   : {
00000    56         push     esi
; 21   :     A a;
; 22   :     B b;
; 23   :
; 24   :     a.a(20);
; 25   :     b.b(20);
; 26   :
; 27   :     std::cout << a.a() * b_.b() << std::endl;
00001    68 90 01 00 00     push     400            ; 00000190H
00006    b9 00 00 00 00     mov     ecx, OFFSET FLAT:?cout@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A
0000b    e8 00 00 00 00     call     ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@H@Z ; std::basic_ostream >::operator<<
00010    8b f0         mov     esi, eax
00012    6a 0a         push     10            ; 0000000aH
00014    8b ce         mov     ecx, esi
00016    e8 00 00 00 00     call     ?put@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV12@D@Z ; std::basic_ostream >::put
0001b    8b ce         mov     ecx, esi
0001d    e8 00 00 00 00     call     ?flush@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV12@XZ ; std::basic_ostream >::flush
; 28   :
; 29   : }

な、なんとクラスに代入、演算しているところが定数になっている!!!!
これが「定数畳み込み」ですか...すごいですね...
なんか「こんな低レベルのテストすな!!」とコンパイラに怒られているような気もしますね。