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