by shigemk2

当面は技術的なことしか書かない

任意の文をマングリングすることができないクソザコなのでconstexprラムダをライブラリで作った #kbkz_tech

kbkz.connpass.com

@wx257osn2

タイトルは長い

  • マンデリング
  • constexprラムダ
  • ラムダ式とは何か

みなさん本当に初心者なんですか

  • 変数
  • 関数
  • 関数オーバーロード
  • テンプレート (型や整数の抽象化して、コンパイル時にそれを解決)

f:id:shigemk2:20150517155441p:plain

constexprとはなんだ

  • 巷では中3女子
  • 変数につけるとコンパイル時定数
  • 関数につけるとコンパイル時/実行時選べる

コンパイル時処理

  • 実行時に走るプログラムを書く
  • コンパイル時処理はコンパイル時にプログラムが走る
  • 処理をした結果がバイナリに直接埋め込まれる
  • 実行時コスト0なので速い。
  • キャッシュに載り切らないことがあるので実行時のほうがはやい

constexpr関数

  • 実行時にもコンパイル時にもよべる関数
  • どちらでも同じ処理を行うのであるから、1回書いたらそれで終わりにしたい
  • コンパイル時にでも普通に処理が書きたい

ラムダ式

  • 関数のようなものを生成する式
  • 式(オペランド)なので、式の途中に出現可能

f:id:shigemk2:20150517155825p:plain

  • もともとは関数型プログラミングのほうから来てる機能
  • 式レベルでしか扱えなかった
  • 機能としてはC++03からライブラリとしては存在していたけど、11より言語機能として搭載

マングリング

  • バイナリの話
  • 関数オーバーロードってどうやってるの
  • C言語だと関数名がそのまま関数を識別する
  • name mangling(名前修飾 名前を複雑にして、関数名を識別しやすくする)
  • コンパイラ(が使用しているABI)ごとに修飾の方法が違う
  • コンパイラごとにバイナリ互換とれない主な原因

なぜ任意の文をマングリング出来ないのか

  • 「マングリング」=「関数のシンボル名を決める」
  • 文はプログラムの構成要素ほぼそのもの
  • 名前がプログラム

その弊害

  • 文をマングリング出来ないといったけど使うことあるのか
  • 名前と型をマングリングする

decltype

  • decltype(式)で式の型を取得できる
  • 型はマングリングの対象

  • ラムダ式はマングリングの対象ではない

  • 関数の中身はマングリングの対象ではない

C++のラムダ式

  • マングリングの対象ではないからコンパイルの対象にもならない

コンパイル時ラムダ式

  • 使いたい。。。
  • 文をマングリングすることは糞雑魚なので出来ない

使い方

f:id:shigemk2:20150517160641p:plain

f:id:shigemk2:20150517160711p:plain

中身の概要

  • 基本はExpression Template
  • ラッパークラスに含まれていれば中身を
  • 含まれていなければvalで包む

  • 基本関数はそれぞれ実装クラスが存在

  • バックエンドで自作のconstexprTuple採用

実装のつらみ

  • 型が長い
  • C++14が使いたい人生だった
  • Clangの無限再帰バグでC++14使えない
  • Variadic Placeholderの実装のためにコード全域に変更
  • Selfの実装のためにコード全域に変更
  • 相互依存が激しいので実装が飛散している