2020-02-01から1ヶ月間の記事一覧

static variableの初期化順序

C++

template structの中にstaticなstd::mapを作ってmain()よりも前にアクセスしたらその時点ではまだコンストラクタが呼ばれておらず、中身がゼロ埋めされていてセグフォになった。 静的変数の初期化順序は基本的に書いた順、翻訳単位が違ったら実装定義、実装…

std::variantと不動点演算子

C++

実は、std::vectorはC++17から不完全型をサポートしたので、std::variantと組み合わせると以下のようなコードが書ける。 struct config_t { std::variant<bool, int, double, std::string, std::vector<config_t>> data; }; これを上手く使えばJSONなどの木構造をかなり簡単に(ポインタを陽に触らずに)扱える。std</bool,>…

アセンブリ解読:Fortran配列の中身

前回の続きです。 以下のコードを-O3でコンパイルすると、 pure function nth(v, n) result(out) implicit none integer, intent(in) :: v(:) integer, intent(in) :: n integer :: out out = v(n) return end function nth こんなアセンブリになって驚いた…

x64で配列の添字にintを使うと遅い

こういうツイートを見た。気になったので試してみたら本当にそうらしい。 x64でEAXに値を入れるとRAXの上位は(符号拡張ではなく)0になる。なのでC/C++で配列の添え字に32bit整数を使うと符号拡張命令が追加されて遅くなる。LP64環境で配列の添え字にintを使…

thrustのバグを見つけて直した話

thrustがasync対応していたのを先月見つけた。 in-neuro.hatenablog.com ドキュメントがまるで書かれていないところをコードを読み進めて試していたのだが、そこで不可解な動作を発見した。 以下のようなコードを書いたとする。thrustの関数を非同期に読んで…

tomlの複数行文字列内でのクオートの取り扱いに関するエッジケース

何が起きたのか TOML規格レポジトリにこの記事のタイトルの通りのアップデートがあった。 github.com 基本的に、toml11ではTOMLのmasterブランチに入った変更は TOML11_USE_UNRELEASED_FEATURES を define しないと有効にならないようにしている。だがこの手…

TravisでOpenMPは使える

使えるみたいです。ただしOMP_NUM_THREADSを小さめの値、4とか、にしておかないといけないらしい。というのも、VMを動かしているハードのコア数(めちゃくちゃ多いんだと思う)を取得するからだそうで。CIに投げてる全員がそんな数のスレッドを立ち上げたら…