Home > Archives > 2009年11月11日

2009年11月11日

gcc 4.5.0 (experimental) でラムダ式使ってみた

gccのsvnにある4.5.0ならc++0xのλ式が使えるのでgccをコンパイルしてインストールしてみた.

とりあえず std::transform を一行でかけるのかなぁと以下のコードを書いてコンパイル.オプションに -std=gnu++0xを指定.

#include <iostream>
#include <algorithm>
#include <vector>
 
int main(int argc, char *argv[])
{
  std::vector<int> x;
  int n = 10;
  for(int i = 0; i < n; i++) x.push_back(i);
  for(auto it = x.begin(); it != x.end(); it++) std::cout << " " << (*it);
  std::cout << std::endl;
  std::transform(x.begin(), x.end(), x.begin(), [](int a) { return (a + 1) ^ 7;});
  for(auto it = x.begin(); it != x.end(); it++) std::cout << " " << (*it);
  std::cout << std::endl;
  return 0;
}

そしたら普通にコンパイルが通って,実行したら配列要素がちゃんとインクリメントされていた.

ちなみに,上のプログラムのtransformのメインループは

L42:
        movl    (%rax), %edx
        addq    $1, %rcx
        addl    $1, %edx
        xorl    $7, %edx
        movl    %edx, (%rax)
        addq    $4, %rax
        cmpq    %rcx, %rbx
        ja      L42

のようにコンパイルされた(-O3 オプションで).λ式だと変なオーバーヘッドが入らないらしい.boostのlambdaないしfunctionsあたりだと変なオーベーヘッドが掛かってたけど,c++0xのλ式だとその心配がなく簡単に使える.ただし,このλ式を変数に代入したりしたときにどうなるかはまだ試してない.

Home > Archives > 2009年11月11日

Search
Feeds

Page Top