理系学生日記

おまえはいつまで学生気分なのか

メタ関数では本当にコンパイル時に計算してくれるのか

テストコード。\sum_i^N i を計算する。N=10 なので、答えは 55 になる。

template <int N>
struct sum {
  static const int value = N + sum<N-1>::value;
};

template <>
struct sum<0> {
  static const int value = 0;
};

int main() {
  return sum<10>::value;
}

アセンブラコードを吐かせてみる。

$ g++ -O0 -S template-meta.cpp

中身を確認してみる。これは一部だけど、$55 が eax に入って return されることがわかります。ホントに計算されてることが確認できた。

_main:
LFB1480:
	pushl	%ebp
LCFI0:
	movl	%esp, %ebp
LCFI1:
	subl	$8, %esp
LCFI2:
	movl	$55, %eax
	leave
	ret