struct A { void func() { i=1; //(1) i=2; } volatile int i; //(2) }; A a; void main() { a.func(); }
a) VC7.1で上のコードをそのまま実行するとfuncがmain内に inline展開されるんだけど、(1)のコードが実行されていない模様。 b) (1)を何度も繰り返した場合、inline展開されずfunc内で全ての 代入が行われている。 c) (2)を非volatileにした場合、a/b)のいずれの場合でも(1)は省略される。 d) (2)をvolatileのままグローバル変数に移動するとa/b)のいずれの場合でも (1)は省略されない。
/usr/lib/gcc-lib/i386-redhat-linux/2.95.3/../../../../include/g++-3/stl_algo.h: In function `const struct A & __median<A>(const A &, const A &, const A &)': /usr/lib/gcc-lib/i386-redhat-linux/2.95.3/../../../../include/g++-3/stl_algo.h:1283: instantiated from `__introsort_loop<A *, A, int>(A *, A *, A *, int)' /usr/lib/gcc-lib/i386-redhat-linux/2.95.3/../../../../include/g++-3/stl_algo.h:1320: instantiated from here /usr/lib/gcc-lib/i386-redhat-linux/2.95.3/../../../../include/g++-3/stl_algo.h:46: passing `const A' as `this' argument of `bool A::operator <(A)' discards qualifiers /usr/lib/gcc-lib/i386-redhat-linux/2.95.3/../../../../include/g++-3/stl_algo.h:47: passing `const A' as `this' argument of `bool A::operator <(A)' discards qualifiers /usr/lib/gcc-lib/i386-redhat-linux/2.95.3/../../../../include/g++-3/stl_algo.h:49: passing `const A' as `this' argument of `bool A::operator <(A)' discards qualifiers /usr/lib/gcc-lib/i386-redhat-linux/2.95.3/../../../../include/g++-3/stl_algo.h:53: passing `const A' as `this' argument of `bool A::operator <(A)' discards qualifiers /usr/lib/gcc-lib/i386-redhat-linux/2.95.3/../../../../include/g++-3/stl_algo.h:55: passing `const A' as `this' argument of `bool A::operator <(A)' discards qualifiers