あわててでかける。電車の乗り換え待ち時間に菓子パンを流し込む。

image

丸の内線の銀座駅で降りて地下道で東銀座へ。時間ぎりぎりで会場に到着。

_1200362_1200351

constexpr関数処理はコンパイル時処理。これはいい。実行時が霞んで見える。CPUの嬌声が聞こえてきそうだ / ボレロ村上 @bolero_MURAKAMI

  • 資料: http://www.slideshare.net/GenyaMurakami/onstexprcpu
  • ふだんは岡山で陶芸家で縄文式土器をつくっている。
  • constexpr: C++11で導入→C++14で大幅緩和
    • constは修飾子、consteprは宣言での指定子
  • constexpr導入の動機
    • コンパイル時評価 (C++03ではnumeric_limits::max()がコンパイル時にしか呼べなかった)
    • テンプレートメタプログラミングの置き換え
  • C++11: ローカル変数だめ、副作用だめ(iostreamとか)、ループ/ifはだめ(?:と再帰で書く)、returnは1箇所だけ。
    • 再帰は最初は許可されない予定だった。再帰がないとTMP(template meta programming)をおきかえられない。
  • C++14: 緩和されてgoto以外の文をいくらでも書けるように。
  • C++11でfind()を実装しようとすると分割統治(log N)にしないとネストの制限にひっかかってしまう。線形サーチだと(N)。
  • C++14のfind()/merge()ならconstexprをつけるだけ。merge()はoutputiteratorをつかうので。
  • C++14: IO, new, try-catch (throwは書ける), RAII, lambda expr, グローバル変数の参照(参照しなければよい).
  • C++11のconstexprはinlineの最適化ににたやりかたで置換してた。
  • C++14のconstexprは抽象マシンで定義。
  • gccはmemoizeを載せてるので速いが、32x32 pixelのレイトレーシング 8GBくらい喰う。
  • boostの特徴: ダックタイピング(generic programming)、自由関数で実現(cf std::string)、疎結合、機能分割がしっかり。
  • templateをつかうのがC++らしさに。
  • constexprをつかうようにするとC++らしくなる(らしい)
  • 仮想関数をconstexprにおきかえるには?→型パラメータをつかう。
  • range: begin,endイテレータの組
  • range | adaptor がrangeをかえす。rangeアダプタは通常副作用を持たない。
  • コンテナよりもrangeをつかおう。ForwardIterator,InputIteratorをつかおう。型制約をつかおう。
  • メンバ関数をつかわないように。
  • sproutの例
    • Sprout.Darkroom: タプルの組み合わせで表現。配置物は関数オブジェクトで表現。
      • 8Kix8Ki pixのレイトレーシングで160時間。いちどにはできない(メモリが足りない)ので、4x4で計算したのを結合する。
    • Sprout.Weed: パーサコンビネータ
      • expression template(ET)をつかっている。ETは一時変数の使用を抑制するために発明された(行列とか)。boost.sprit。
    • Sprout.Compst: コンパイル時波形処理
      • 基本波形はRangeとして表現されている。
      • シンセサイザーエフェクトはRangeアダプター。エフェクトを重ねると型がたいへんなことになる。
  • C++14ドラフト: std::array::operator[]の非const版はまだconsteprされていない。
    • 標準ライブラリに独自拡張をすると規格違反になるので、実装実績を積むのがむつかしくなる。
  • C++1x → C++14, C++1z → C++17?

[2014-06-28 15:06]

  • Q: サイズ可変なコンテナがあつかえないのは困る。
  • A: 実用的につかえるようにするにはnewが必要で、それはGCがあれば可能らしい?
  • Q: conextexprで書くと実行時の性能はどうか?
  • A: ケースバイケースだが、find()などは変らないパフォーマンス、sort()は動的なメモリを使えないのでちょと落る。コンパイル時と実行時でコードを変えるのは入らないっぽい(is_constexpr)。

[2014-06-28 15:12]

トイレ+休憩

缶コーヒー80円ごくごく。

[2014-06-28 15:20]

Define and Expresssion of CPP macro / でちまる @decimalbloat

  • 資料: http://www.slideshare.net/digitalghost/define-andexpansionofcppmacro
  • Cプリプロセッサメタプログラミング
    • sed/awkとかわらない字句レベルC++のコードを生成する。
  • 構文を理解するCPPも提案はされた。10年単位で待てば。
  • 暴力で解決。
  • BOOST_PP_ と名前がぶつかるのは、当たり屋。
  • PHP/perlでコードジェネレートすればいい。
  • 評価順序がCとCPPで大きく違う。外側から評価する; 外側を置換→連結→置換→元の場所に挿入→最初にもどる

>}}

#define CAT(a,b) CAt1(a,b)

#define CAT1(a,b) a##b

CAT(a, CAT(b,c))

=> ABC

||<

  • 基本的に数値やboolをあつかうにはdefineを並べるしかない。
  • データ構造: シーケンス:(a)(b)(c)かタプル(a,b,c)か、よく使うのはこの二種類。
  • シーケンスは長さがかえられる、タプルは固定長(variadic macroがはいったので、どんな長さでも化).

[2014-06-28 16:06]

  • Q: CPPとおしたあとのコードをみやすくするには?
  • A: 手で改行を入れる。boost wave? pragma でデバッグ出力できる? gccとwaveで展開規則がちょっとちがってるので使えないかも?
  • Q: SCOPE_EXITの名前をユニークにするには?
  • A: __LINE__をつかっている。乱数を生成するマクロとかVCには自動インクリメントされるマクロがある?

[2014-06-28 16:09]

[2014-06-28 16:16]

C++の歴史 / 江添 @EzoeRyou

  • Cpre → C with Clsses: まだプリプロセッサレベル。線形探索より難しいアルゴリズムなしに実装できるべき。
  • メタプログラミングの初期に発見された技法はC++の新規格の叩き台として有効。
  • 過去: ANSI下院 ISO上院: ANSIがCDをだしてISOがNBを出してのループ
  • 昔は非公開、今はC++DraftはgithubにTeX。
  • C++98は新技術においつくために一旦出した。
  • C++03はバグフィックス版
  • C++l1はコンセプト機能を取り除くために1年半遅れた。
  • C++1yはC++11のマイナーアップデート (たぶんC++14) Clangは実装済。
  • C++17 (C++1z) メジャーアップデート。ドラフトもまだまだ。
  • EC++: 言語が分断するよりも標準化委員会に合流。Performance TRとしてまとめられる。
    • C++コンパイラーを1企業で開発できるような規模ではなくなった。(MS社くらい?)
  • ITSCJ(情報規格調査会)に金がない。ソフトウェアでのISOのブランドが低下。コミュニティ主導になってきた。
    • ISOはアメリカの独走に対抗するためにヨーロッパがつくった政治組織。
    • 個人メンバーやメールメンバーは2015/03でなくなってアドバイザーになる。
  • ここ半年は政治をやってた(現在進行形)

[2014-06-28 16:54]

  • Q: 今の組織を解体する?
  • A: たぶんむり。権利は手放さない。

[2014-06-28 16:55]

[2014-06-28 17:00]

templateで依存型 / 南山まさかず @minamiyama1994

[2014-06-28 17:05]

[2014-06-28 17:08]

constexpr idioms / @fimbul11

[2014-06-28 17:20]

  • Q: クラステンプレートを多用するが?
  • A: 線形や素朴な線形再帰でも小さいときは動くし。Nが大きくなったときにコンパイルできるかどうかが問題。
  • Q: find()など分割統治でやるとイテレータの計算量が大きくなる。
  • A: C++14ならループがいいけど、型MAPだとこういう技法をつかわざるをえない。

[2014-06-28 17:23]

[2014-06-28 17:24]

Cocos2dx(Ver2)が闇な話 / ぽんこつ @karupanerura

[2014-06-28 17:34]

[2014-06-28 17:35]

C++初心者書がC++11でparserを書いてみた話 / @karupanerura

  • lisp のparserをかいてみた。
  • auto便利. templateで長くなっても安心。
  • shared_ptr便利.
  • range for便利. autoとくみあわせると便利l.
  • 「オブジェクト指向」で書いてたので「constexpr」で書き直す。

[2014-06-28 17:41]

  • Q: 相互includeを避けるには必要なところだけ抜いてヘッダにするとかすれば解決。

[2014-06-28 17:44]

[2014-06-28 17:45]

valgrindは実行時メモリチェッカー。これはいい。コンパイル時チェックは結局頼りにならない。メモリの悲鳴が聞こえてきそうだ / @tikal

  • http://www.slideshare.net/ledyba/cpp-36404945
  • valgrind(バルちゃん)
    • 10倍くらい遅い。x86のコードを内部コードにしてチェックコードいれてx86にJITで変換。
    • シングルトンやキャシュをつかっていると誤爆
    • ドライバーのコードで誤検出する

[2014-06-28 17:51]

cocos2dx ver2ダメダメネタが三連発で開場沸いた。

はらへったのでスニッカーズをくってから、時折小雨のふる天気だが、有楽町まで地上をあるいてぶらぶらと帰る。

image_1200371