入力に応じてテンプレート引数を変える

C++

C++は静的に型付けを行うので、基本的に実行時に型を切り替えることはできない。なので、入力に応じて異なる型を返すことはできない。だが継承を使っているなら、常に基底クラスへのポインタを返しつつ、入力に応じて派生クラスのテンプレート引数を変更する…

言語間の速度差について

全く同じアルゴリズムを似たようなスキルの人が書いても、使った言語によって速度差が出る。 たとえばガベージコレクタが一瞬実行を停止させてしまったり、配列の境界チェックが必ず行われたり、ネイティブコードにコンパイルされなかったり、そもそもの処理…

-OfastはNaNチェックを無効化する

C C++

gccには-Ofastというオプションが存在する。これは、標準規格への適合性を犠牲にしてでも高速なバイナリを吐くモードだ。色々なことが犠牲になるが、NaNチェックも犠牲になる。 以下のコードを見て欲しい。 wandbox.org #include <iostream> #include <cassert> #include <cmath> int m</cmath></cassert></iostream>…

gitbookのmathjaxプラグインが突如動かなくなる

どうやら昨日mathjaxがメジャーバージョンアップ(v3.0.0)したらしい。リリースノートによると、中身がモダンなテクニックを使って全て書きなおされているようだ。 This version is a complete rewrite of MathJax from the ground up using modern program…

templateクラスを継承するtemplateクラスのデストラクタをoverrideし、かつdefault指定してextern templateでビルドするとintel compiler (v18)だけlink errorになる

C++

タイトルが長い。 でもこれ以上何かを削ると不正確なタイトルになる。もしかするともう少し条件を広げても同じエラーが出るかも知れないが。 extern templateというのがあり、以下の記事に詳しい。 qiita.com かい摘んで説明しておこう。ヘッダファイルでext…

TOMLで浮動小数点数の指数部分でleading zeroが許可される

github.com これがTOMLの作者(Tom Preston-Werner)の手によってマージされていた。一応masterブランチにマージされてもリリースまでにrevertされる可能性はあるとはいえ、それなりの確率でTOML 1.0.0でリリースされると思われる。 この変更で、以下のよう…

BOOST_ROOTが無視される

今までBoostは1.58~1.69までしかインストールしていなかったのだが、今日1.71をビルドしてインストールした。そしてこれにハマってCMakeCacheやbuild/ディレクトリを消してはCMakeを実行しなおすことを繰り返して10分くらい時間を無駄にした。 github.com リ…

OpenGL + CUDA interopのコードを読む

しばらく前に、CUDAを使ってGPU上に作ったデータをそのままGPU上でpixelの配列にしてそのまま画面に描画しようとしていた。 cuda_practice/ising-show at master · ToruNiina/cuda_practice · GitHub 例えばこれなのだが。これは、isingモデルをシミュレーシ…

メモ:cerealと派生クラス2

C++

cerealで継承を使ったサンプルを少し前に掲載したが、これらのクラスがテンプレートだったらどうなるか。特に、継承関係を登録するマクロ。 この部分だ。 CEREAL_REGISTER_TYPE(sample::Derived) CEREAL_REGISTER_POLYMORPHIC_RELATION(sample::Base, sample…

メモ:cerealと派生クラス

メモです。cerealは説明不要のシリアライズ用ライブラリ。 派生クラスをstd::unique_ptr<Base>として持っている時の最小サンプル。 cereal::base_class<Base>(this)をシリアライズするのを忘れない CEREAL_REGISTER_TYPE(sample::Derived)を名前空間の外に書く。セミコロ</base></base>…

parallel linear BVH (LBVH) をCUDA+thrustで書いた

久々に少し非自明なことをCUDA+thrustでやった。大体動くようになるまでまる一日(半日+半日なので別のmetricsでは2日)かかった。 github.com BVHとはなんぞやという話は、以下の記事にとてもよくまとまっている。というか、多分この記事の著者は私のような…

toml11 v3.0.0リリース

毎回思うんだけどどういうタイミングでリリースタグ打てばいいのかよくわからない。皆どうしてるんだろう。 github.com 基本的に前回記事を書いた時からそんなに変わっていない。一応自分で使ってみて気になった細かなことがいくつかあるが(例えばカスタム…

toml11 v3ができてきた

以前「やりたいな〜」と書いた通りの変更をゴリっと入れてみた。まだマージしていないが、v3ブランチがpushされている。今まで通していたテストは全て通った。追加機能のテストも最低限は通った。しばらくテストの拡充をしてからベータ版を出すつもりでいる…

C++ if文再訪

C++

今回はC++規格書のif文周りを読んでみたい。 今更一体全体何なんだと思う人が大半だと思うが、普段息をするように使っているものだからこそ、規格書を読んでおくのは良いことだと思うのだ。普通の人が規格書を読むのは、知らないものについて勉強するときか…

記憶の中の場所

技術記事ではない。

Gitbookで生成したファイルがGitHub pagesに無視される

TL;DR: .nojekyllという名前の空ファイルをgithub pagesのルートに入れる タイトルの通りの現象が起きて困っていた。 解決策の拍子抜け感に比べて状況としては結構こんがらがっていたのだが、順に説明していこうと思う。 以前に書いた方法で、Gitbookを使っ…

小さなlisp処理系を作った

ふと、そういえばbrainfuckよりも高級な言語処理系を作ってない(太古の昔に作ろうとした滅茶苦茶なやつは除く)ことを思い出し、ちょっとlisp処理系でも作るか〜〜と思って実装した。連休だし、普段やってるプロジェクトしかやらずに過ぎていくのももったい…

toml11をバージョンアップした

しすぎじゃない? 変更点 まずは、C++17になっていたら文字列をstd::string_viewで受け取ったり、toml::valueをstd::string_viewで初期化できるようにした。どうやらC++17で使っている人がいたっぽいので、特に要求はなかったがあったほうがいいかなと思って…

fishでgitの補完が遅い場合は3.0にアップデートする

遅すぎた(間違えてtabを押すと数秒止まる)ので「fish completion slow」とかでぐぐってみたところ、「遅いよ」なるIssueが立っていた。 github.com このコメントで「3.0で速くしたよ」というコメントがあった。 Slow git auto-complete... how to turn off…

toml11を60倍高速化した話

toml11はしばらく前に開発して、最近も結構いじり続けており、それなりの数のユーザーがついてるっぽくて結構嬉しくなっているライブラリだ。そもそもが自分のために作ったものなので、自分の都合で結構改変することがある。これは、まあレポジトリのオーナ…

std::alignを動的メモリ確保と一緒に使う

C++

はい。C++17を使っている人はnewが全部やってくれるようになったので不要な話です。C++17以前のコードのため。 Introduction アライメントとは、ざっくり言うとメモリ上の位置調整であり、普段は気にしなくていい(コンパイラやmallocがちゃんとやってくれる…

smart pointerを使う場面

C++

なんか話題になっていたので、具体例を考えてみたい。 継承を使っているとき 通常、C++で継承は使わない。テンプレートの方がたいてい実行時性能がよいので、テンプレートを使うからである[要出典][独自研究]。 ライブラリの場合は普通ユーザーがコードを書…

順列都市 再々再読

注:ネタバレを避けようという気持ちは全くありません。むしろ根本的なアイデアを解説してさえいる 『順列都市』を最初に読んだのは確か中学三年生か高校一年生の頃で、当時は塵理論のアイデアを今にして思えば何一つ理解できていなかったし、主人公ダラムが…

CUDAでカーネル関数がスキップされる(ように見えた)

1ヶ月くらい、土日や夜の自由時間を主に使ってGPUを使ったレイトレを書いていた。この話もまとめたいな〜と思いながらダラダラしていたら1週間が経過してしまった。みんなどこから時間をひねり出しているんだ? 私以外の人々はその人生で一切ダラダラしない…

C++20 Contract

C++

そういえば最近はC++関連のことに触れていないなと思ったので、今日はまだ日本語の説明があんまりないように見えるContractでも取り上げてみたい。サーベイ不足だったら申し訳ない。提案に関する情報は、 P0542R3: Support for contract based programming i…

AIアシスタントの中身はどうなっているんだろうか

たまには下調べや引用などをせずに思ったことを適当に書き散らしてみたいと思う(いつもでは?)。なので、この記事には裏が取られた情報や5秒ググればわかることなどは書かれていない。すべて想像で書いている。 昨日Siriに少し話しかけており、ふとこいつ…

Rust Book 勉強会 #3 フォローアップ

Rust Book 勉強会で発表をしてきた。 rust-kansai.connpass.com これは、結構前にQiitaのC++アドベントカレンダーで書いた内容と、Ben Deane氏によるCppConでの発表"Using types effectively"が下敷きになっている。 www.youtube.com あ、この資料にクレジッ…

Rustで型推論を助けるトリック

Rust業界に詳しくないので既に広く知られているものかもしれないが、昨晩突如として以下のようなトリックを思いついた。 struct X<T> {/* fields omitted */} impl X<f32> { pub fn f32(self) -> Self {self} } impl X<f64> { pub fn f64(self) -> Self {self} } let x = </f64></f32></t>…

Rustでtraitのassociated typeに対してtrait boundaryを課す

RustのTraitは内部に型を持つことがある。関連型(associated type)だ trait Hoge { type Value; } impl Hoge for Piyo { type Value = Fuga; } このValue型についてトレイト境界を付けたい。 つまり、ある型Tがあり、型<T as Hoge>::ValueがOtherTraitを満たす場合の</t>…

Rustでgenericなenumを作る

パッと出てこなかったので。 例えば、位置か速度か力かわからないベクトルがあるとする。すると、Rustならenumにするだろう。 enum CoordKind { Position{x:f64, y:f64, z:f64}, Velocity{x:f64, y:f64, z:f64}, } let pos = CoordKind::Position{x: 1.0, y:…