2017-01-01から1年間の記事一覧

コンパイラの最適化と専用命令について

asm

Fast inverse square rootなるものをご存知だろうか。これは、1.0 / sqrt(x)を高速に近似計算する命令である。 Fast inverse square root - Wikipedia この計算は非常によく使う。例えばベクトルがあるとする。このベクトルを規格化したい。つまり長さを1に…

コードの美しさについて

コードが綺麗とはどういうことか、の基準は人によって異なると思う。しかし例えば以下のような関数があまり綺麗ではないという気持ちは、共有できるのではないだろうか。 void func(int N, double*** v1, double*** v2, double** a, double** b, int* c, int…

数値積分のインターフェース

C++

子細合ってヤバい形の積分を解く羽目になったので数値積分をすることにした。 別に数値積分の複雑なアルゴリズムの解説や異常なまでの最適化などを紹介するわけではなく、非常に基本的な台形積分を使い、そこまで最適化も考えずにやる。 だがそれだけだと何…

apt-get upgradeでfishが大量のエラーを吐くようになった

ま た か (bobthefishでstring関係のエラーが出た - in neuro) 軽い気持ちでapt-get update && apt-get upgradeしたところ、fishが2.7.0になった。その後、argparseがないとかなんとかのエラーが出る。 bobthefishが内部で使っているコマンドなのでテーマ…

std::hash<integral_type>

C++

ふと、std::hash<std::size_t>の実装がどうなっているか気になった。 ハッシュ関数は、何かの型の値を整数型に変換する。特にstd::hashはsize_tに変換する関数である。同じ値に対しては同じハッシュ値を返し、別の値同士が同じハッシュ値を取らないようにする。一般にはハ</std::size_t>…

boost::enable_ifの居所について

C++

C++11のstd::enable_ifが使えない環境だと、boost::enable_ifなしにはテンプレート関数をガンガン使っていくのは厳しい。しかし、boost::enable_ifは途中で定義されている場所が変わっている。 boost 1.65.1のドキュメントを見てみよう。 Boost Utility Libr…

謎の演算子

C++

よく知られたネタだと思うが、while文中でカウントダウンするための演算子がある。 int N = 10; while(N --> 0) { std::cout << N << ' '; } 9 8 7 6 5 4 3 2 1 0 逆方向もあるが、カウントダウン演算子にもインクリメント・デクリメントの前置・後置と同様…

動的メモリ確保なしで派生クラスを格納できるクラスを作った

久方ぶりにdomain-specificでないコードを書いた気がする。 Qiitaに基本的なアイデアだけ書いたので、こちらでは少し立ち入った話をする。 tl;dr 先に最大サイズを決めておくことで、そのサイズ以下のオブジェクトを格納できるクラスを作った。 格納できるク…

constな変数の初期化とラムダ

この前、少し初期化が面倒な数値のリストを作らなければならなくなった。しかも結構急いでいた。 適当な例として以下のようなものを考える。 const std::vector<std::size_t> indices{1,4,7,10,13, ... 298}; //流石に手では書けない こんなもの、for文を使えばいいのでは</std::size_t>…

現代のC++

C++17での機能追加について、ネット上では「項目一覧見ただけで読む気失せる」「入門不可能」「闇」「誰も使いこなせない」「絶対に使いたくない」などと盛り上がっている。 だが私は一概にはC++はどんどん初心者を見捨てているとは言えないと思っている。C+…

バイナリファイルの取り扱い

C++

データの保存のために、バイナリフォーマットは広く使われている。なのでそれを読まなければならないケースが多い。 C++におけるバイナリの読み方の一番の基本はstreamの関数std::basic_istream::read(char_type*, streamsize)だろう。 この関数は第二引数で…

変数への参照と「変数そのもの」

Pythonは最近非常に流行っているので、静的型付け言語が好きな私も無視できないどころか使って便利だと感じることもある。 特に大抵のライブラリがPython APIを提供しているので、ライブラリを組み合わせて何かを組み上げる時は向いているだろう。 そんな感…

読んできたプログラミング本

割と今まで読んできた本を聞かれることが多いので、ちょっと思い出そうとしてみる。記憶から漏れているものもあるかもしれないので思い出したら足すかも知れない。 私はC++の前にCを少しだけやっていたので、記憶はそこから始まる。

暗黙の型変換の落とし穴

C++

こんなツイートを見た。 #Thursdaysurvey on this code:> variant<string, int, bool> v = "Hello!"; </string,>

emptyとsize==0

C++

コンテナが空(要素を持っていない)かどうかを確認するとき、タイトルの2つのメソッドのどちらを使うかという話題で界隈が盛り上がっていたようだ。 私はempty()一択だ。サイズが0かどうかを確認したいなら、size() == 0を使うべきだ。だが、コンテナが空で…

大掴みBoost.PolyCollection

C++

この間、Boost 1.65がリリースされた。リリースノートをざっと見た所、新規ライブラリがいくつか入っている。そのPolyCollectionなるものが気になったのでざっと見てみることにした。これはその覚え書きである。 PolyCollectionは、多相型向けのコンテナだ。…

座標ベクトルと汎化について

私の書くプログラムでは、趣味でも仕事でも、低次元(大抵は2か3次元)でのベクトルを扱うことが多い。そうなると普通は座標ベクトルを意味する構造体を作って管理するだろう。

FizzBuzz

C++

会話をしていると、FizzBuzzの話になった。何かの拍子にFizzBuzzを書いてくださいと言われたらどうするだろうか、と思ってちょっと書いてみることにした。たまには気楽に書けるものもよい。 FizzBuzzを自然に捉えると、数字を文字列に変換していくルールに従…

関数型言語としてのC++ Template MetaProgramming入門

C++

C++ではtemplateを使ってコンパイル時に計算を行うことができる。 今回は、関数型言語としての視点からC++テンプレートメタプログラミング(C++-TMP)の簡単な紹介をやってみたい。 注:私はHaskellとlispの経験がホンの少しだけあるが、どちらも使いこなせる…

アセンブリ解読 小休止

asm

これまで、4回に渡ってコンパイラ(gcc v5.4.0)の生成するアセンブリコードを解読してきた。これまでの内容は、以下のような感じになる。 その1: レジスタの使い方、関数の定石、初歩的な最適化 その2: 条件分岐、除算の最適化 その3: 除算の最適化と定数伝播…

アセンブリ解読 その4

asm

その2で宣言した通り、今回の対象はループだ。その2に続きが発生したので番号的には飛んでしまっているが、続きという点は変わらない。 しかしループとなると絶対にSIMDとループアンロールが絡んで面倒なことになる、と思っているので少し腰が重いが、最適化…

アセンブリ解読 その3

asm

前回長くなりすぎたので、追記分を分けておくことにした。 前回は簡易fizzbazzを逆アセンブルし、割り算の最適化に関して面白いものを見たのだった。 アセンブリ解読 その2 - in neuro その続きとして、moduloではなく普通の割り算はどうなるんだろう、と思…

アセンブリ解読 その2

asm

続いた。でもいい題材が思いつかなかったので、条件分岐とかがいいかなあと思いじゃあfizzbazzでいいか、となった。 その1はここにある。アセンブリ解読 その1 - in neuro 文字列を使うのが(アセンブリだと)アレなのでフラグを返すことにする。 #include <stdint.h> </stdint.h>…

アセンブリ解読 その1

asm

簡単なアセンブリを読めるようになりたい。理由はカッコいいから。というのは嘘で、どういう最適化が行われたかある程度わかるようになりたい。 だが、面白いコードが書けるようになるまでにアセンブリだと道のりが遠すぎるので、コンパイラに簡単なコードを…

何らかのフォーマットのファイルを読み書きするライブラリについて

C++

Coffee-millなるライブラリを(凄く昔に)書いている。これは主に分子動力学計算の結果を読み書き・解析するためのものなのだが、解析用の部分は別に開発しているのでまあほぼ読み書きのために使っている。今やっていることが落ち着いたらもう少しメンテした…

Rustを触っている

先週Rustを触っていた。まだ手に馴染んでいないので少し不自由さを感じるが、慣れるまでの辛抱だろう。実際は去年くらいに一度インストールしてチュートリアル程度は済ませていたのだが、説明を見て言われた通りのコードを書く以上のことはしていなかった。…

C++98でもvariantを(バリバリ)使いたい! その2

C++

前回こういう記事が発生した。 c++98でもvariantを(バリバリ)使いたい! その1 - in neuro このときは単に2つの関数をくっつけて即席visitorを作れるようにして終わったものの、variantは普通2つ以上詰め込むことが多いので、N個版をゴリゴリ展開していく…

c++98でもvariantを(バリバリ)使いたい! その1

C++

私はC++98を使っているプロジェクトに参加している。タイトルを見て「2017年にもなってC++98だとォ〜〜」というような感想を抱くかもしれないが、ライブラリとしてC++98をサポートしたいとか、C++98時代から作っているプログラムでメジャーバージョンアップ…

tomlのパーサを作った

C++

こいついつもTOMLのパーサ書いてんな C++で使えるheader-onlyなTOMLのパーサを書いた。実はこれは2度目である。何故またそんなことをしたか。順に説明していこう。 最初に書こうと思った一番の理由は、「パーサを書いたことがなかったのでいい経験になると思…

erratum: 前回の記事に関して

C++

前回の記事を書いた2日後くらいに、よく考えると先のコードはまずいのではという気もちになった。今日まで放置していたのは、まず自分が書いていたコードを直すことと、書かなければならない書類をこなすことに集中していたからだ。書類は数日前に草稿を共著…