@wx257osn2
タイトルは長い
- マンデリング
- constexprラムダ
- ラムダ式とは何か
みなさん本当に初心者なんですか
- 式
- 文
- 型
- 変数
- 関数
- 関数オーバーロード
- テンプレート (型や整数の抽象化して、コンパイル時にそれを解決)
constexprとはなんだ
- 巷では中3女子
- 変数につけるとコンパイル時定数
- 関数につけるとコンパイル時/実行時選べる
コンパイル時処理
- 実行時に走るプログラムを書く
- コンパイル時処理はコンパイル時にプログラムが走る
- 処理をした結果がバイナリに直接埋め込まれる
- 実行時コスト0なので速い。
- キャッシュに載り切らないことがあるので実行時のほうがはやい
constexpr関数
- 実行時にもコンパイル時にもよべる関数
- どちらでも同じ処理を行うのであるから、1回書いたらそれで終わりにしたい
- コンパイル時にでも普通に処理が書きたい
ラムダ式
- 関数のようなものを生成する式
- 式(オペランド)なので、式の途中に出現可能
- もともとは関数型プログラミングのほうから来てる機能
- 式レベルでしか扱えなかった
- 機能としてはC++03からライブラリとしては存在していたけど、11より言語機能として搭載
マングリング
- バイナリの話
- 関数オーバーロードってどうやってるの
- C言語だと関数名がそのまま関数を識別する
- name mangling(名前修飾 名前を複雑にして、関数名を識別しやすくする)
- コンパイラ(が使用しているABI)ごとに修飾の方法が違う
- コンパイラごとにバイナリ互換とれない主な原因
なぜ任意の文をマングリング出来ないのか
- 「マングリング」=「関数のシンボル名を決める」
- 文はプログラムの構成要素ほぼそのもの
- 名前がプログラム
その弊害
- 文をマングリング出来ないといったけど使うことあるのか
- 名前と型をマングリングする
decltype
- decltype(式)で式の型を取得できる
型はマングリングの対象
ラムダ式はマングリングの対象ではない
- 関数の中身はマングリングの対象ではない
C++のラムダ式
- マングリングの対象ではないからコンパイルの対象にもならない
コンパイル時ラムダ式
- 使いたい。。。
- 文をマングリングすることは糞雑魚なので出来ない
使い方
中身の概要
- 基本はExpression Template
- ラッパークラスに含まれていれば中身を
含まれていなければvalで包む
基本関数はそれぞれ実装クラスが存在
- バックエンドで自作のconstexprTuple採用
実装のつらみ
- 型が長い
- C++14が使いたい人生だった
- Clangの無限再帰バグでC++14使えない
- Variadic Placeholderの実装のためにコード全域に変更
- Selfの実装のためにコード全域に変更
- 相互依存が激しいので実装が飛散している