C++

atof の桁数限定高速版

atof をどうしても高速化したくて、桁数を限定すれば高速化できるのではないかと思い、整数部9桁、小数部9桁に限定したものを作ってみました。9桁というのは int や unsigned int で完全に表現できる最大の桁数です。なるべく整数で演算を行って速度を稼いで…

10 の整数乗

10 の整数乗を求める関数で、[-32, 31] 内の int n に対して高速なものを作りました。if ((np32 & ~63) == 0) のところですが、普通は if (0 コンパイルされるのに対し、前者は test (ビットand)と条件ジャンプの組1つで済みます。ちょっとでも速くしたかっ…

高速数字判定

isdigit が inline 展開されないので、ASCII の数字のみ判定する関数を作りました。 // <isdigit.h> #ifndef isdigit_h #define isdigit_h #include <stdint.h> //------------------------------------------------------------ // // 高速数字判定 // /// 高速数字判定のテーブ</stdint.h></isdigit.h>…

VC, CMAKE でアセンブラ リスティング ファイル出力

VC++ で書いたコードをチューニングしていて、単純なコードなのに遅いってことありますよね。 で、アセンブラ コードを見てみたくなったときに使用するのがこのコンパイル オプションです。/FA、/Fa (リスティング ファイル) | Microsoft Learnマシンコード…

spirit x3 double_ パーサの精度が悪い件

boost 1.72 の spirit x3 の double_ パーサを使用していたところ、どうも値がちょっとおかしい。 円周率の小数点以下16桁までの文字列 "3.1415926535897932" で試してみました。 VC14.16.27023 (Visual Studio 2017 15.9.22) 使用。 #include <boost/spirit/home/x3.hpp> #include <iomanip> #i</iomanip></boost/spirit/home/x3.hpp>…

struct と class はマングリングが異なるので混同してはいけない。

BCC では大丈夫だったので、不完全な struct の宣言にも class を使う習慣になってしまっていたのですが、VC ではリンク時にエラーになります。一つ目のモジュール struct Foo { }; Foo* CreateFoo() { return new Foo; } void PrintFoo(const Foo&) { } 二…