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