C++

C++ if文再訪

C++

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

小さなlisp処理系を作った

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

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

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

toml11を60倍高速化した話

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

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

C++

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

smart pointerを使う場面

C++

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

C++20 Contract

C++

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

RustとC++のジェネリクスの性格の差

今までRustは使いまわすことのない適当なスクリプト的にしか使ってこなかったので、実際のところ本質的に難しいことは何もしてこなかった。その間は非常に楽で、言われるほど難しくないのではと思っていた。が、最近コードを使いまわそうと思って書き始めた…

最強のC++実装TOMLパーサーが完成した

ここ1, 2週間費やしていた作業が完了し、めでたくtoml11のバージョン2.0.0をリリースした。 github.com このバージョンアップで、 コードが凄まじく美しくなり、 エラーメッセージが最強になり、 TOML v0.5.0 (最新) に対応した。 せっかくなのでこの記事で…

CとC++のIdent

C++ C

今日、妙な話を聞いた。CかC++かでコードを書いていたところ、変数名を長くすると32文字だかそこらでtruncateされてしまい、前半が同じ名前の変数を使っているとコンパイルエラーになってしまったというのだ。私は(少なくともC++で)変数名に文字数制限があ…

std::ratioについて

C++

C++にはコンパイル時の有理数計算ライブラリがある。個人的な理解では、これは<chrono>のために入ったライブラリで、<chrono>がdurationを綺麗で速い(使いやすいとは言っていない)やり方で実装するためのものだ。コンパイル時に比率を計算できるので、実行時にかかるオーバ</chrono></chrono>…

アライメント解説

C++

しばらく放置してしまっていた。中々書くべきことが見つからなかったので。Nintendo Switchを購入してしまい、遊んでいたというのもあるが。 今回は、ちょっと普段気にしないアライメントのことについて話してみようと思う。 以前、C++17でのアライメント指…

Expression templateとfmaについて

Fused Multiply Addという命令がある。これは、a * b + cという形の演算を1命令で処理するものだ。丸めが一度しか走らないので精度がよくなる。以前、理論値と数値計算を比較してテストするときにこいつが使われるかどうかでテストが通ったり落ちたりして困…

maveの中身について

前回、SIMDベクトルライブラリを作った話をしたが、そこでやっていることについてかいつまんで書いておく。 まず、以下のようなクラスがある。 namespace mave { template<typename T, std::size_t R, std::size_t C> class matrix; template<typename T, std::size_t N> using vector = matrix<T, N, 1>; } これについて、ごく普通の演算子</t,></typename></typename>…

SIMDベクトル・行列ライブラリを作った

TL;DR 高水準なAPIでSIMD命令を使って小さなベクトル・行列計算するためのライブラリを作った。 github.com 名前は安直だが MAtrix と VEctor からとった。 数年前にもExpression Templateを使って似たようなものを書いたことはあったが、これは的を絞った分…

boost::compressed_pairの使いドコロ

C++

使いドコロがわかりにくいと噂のboost::compressed_pairというものがある。今日はこれの具体的な使いドコロを紹介してみたい。 ところでなぜ私の使っているIMEは「つかいどころ」を「使いドコロ」と変換するのだろう。まあそんなに違和感もないのでこのまま…

追記:リテラル数値について

C++

ところで、昨日の記事で、以下のコードはコンパイルエラーになって面倒だという話をした。 template<typename T> T f(T x, T y) { return x + y; } auto z = f(1.0f, 2.0); // f(float, double) 一応追記しておくと、これはtemplateだから生じる問題とかではなくて、オー</typename>…

リテラル数値と精度について

背景 C++では1.0とか書くとdoubleとして解釈され、floatにするには1.0fなどと書かねばならないことはご承知のとおりだ。また、doubleとfloatの演算の結果はdoubleになる。 これはtemplateを使うときに若干面倒になる。例えば、以下のような関数fを実装したと…

中に入れる型を決めないままコンテナだけを決める

C++

背景 これはある実験機器から出てくる特殊なフォーマットの実験データを読むために作ったライブラリのために考えたやり方である。 そのデータは画像データとヘッダ情報から出来ており、基本的にはそれらのペアを返すことになる。だが数百KB〜数百MB程度と大…

微妙に便利なgccのオプション

C++

普段アセンブリコードを眺めるときは、最初に覚えた方法であることと、たいてい同時に実行して確認しているのもあって、objdumpを使っている。 が、コンパイル結果のアセンブリコードを見たいだけなら-Sで十分である。 $ cat "double add(double x, double y…

reluを分岐無しで実装する

ReLUとは、ご存知の通り、xが正の値ならxを返し、そうでなければ0になるという非常に単純な関数である。だがこれが深層学習において重要な役割を演じたのだから面白い。バックプロパゲーションをする時に微分係数が1より小さいよくある活性化関数だと指数的…

tr1とboost/tr1でis_permutationがつらい話

C++

なんとも重箱の隅をつつくような話だ。 私が開発に参加しているプロジェクトがあり、そこでは(古くから開発されているので)C++98が使われている。だが先進的なものも積極的に使おうとするプロジェクトでもあるので、Boostやtr1を使ってもいた。CMakeでtr1…

一番簡単な画像フォーマット

世の中には画像フォーマットが沢山ある。データを圧縮してサイズが小さくなるフォーマットや、様々なメタデータを持てるフォーマットなど色々だが、自分で作るとなると何が一番楽だろうか。 ある意味ではsvgだろうが、今回はビットマップということにする。s…

古い標準ライブラリ実装を新しいコンパイラで使って困った話

C++

背景 C++11ではconstexprメンバ関数は暗黙にconst指定される。 template<typename T> class X { public: constexpr T get_member() /* const */ {return member_;} private: T member_; }; この仕様はある程度面倒を引き起こしていた(参考:http://boleros.hateblo.jp/e</typename>…

C++17: 動的メモリ確保とアライメント

C++

背景 アライメントまわりのことを調べていたらC++17でaligned_allocとnewの新しいオーバーロードが入っていたようで、少し規格書(N4659)と元になったP0035R4にあたってみることにした。 (最初C++2aのN4727を見て書いていたのでN4659を確認したが、内容に…

zip_iteratorとstd::iter_swap

C++

少し頑張って解決しようとした問題が実は解決できないことに気づいてしまったお話 TL;DR: std::iter_swapをフック可能にしてほしい。 背景 配列が二つあったとして、その片方をキーとして使って、両方の配列を同時にsortしたいと言う気持ちがある。 v1 = {4,…

基本ベクトルの場合の最適化(3次元幾何)

C++

数カ月触れていなかった自分が書いたコードを見た所、驚くべきものを発見した。 3次元空間内をある方向に向けてある距離だけ動いたオブジェクトが衝突するかどうかを判定し、また衝突するときはどれだけ動いたら衝突するか計算するコードがあった。 このよう…

コンパイル時ルックアップテーブル生成について

C++

(今更感) 目的 非負整数値を取る関数があるとする。そしてそれを実行中に非常に多くの回数呼ぶ(数百兆回とか)、ということは、科学技術計算ではよく見られる光景である。 整数値を取るので、恐らく何度もピッタリ同じ値を計算することになるだろう。 す…

エラー時はメッセージを返すが、成功しても返すものがない関数

C++

今、Cライブラリをラップしているのだが、副作用を起こす関数の戻り値をどうするか考えている。 前提:全体のエラーハンドリング 前提として、エラーハンドリングにはここまで例外送出でなくboost::optionalとexpectedを用いている。 基本的に、value_or()で…

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

C++

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