目次 >> C、C++
ここでは、C、C++のTipsについて述べる
Unix系OSでマイクロ秒まで計測するには、gettimeofdayを使用します。必要なヘッダは
#include <sys/time.h>
です。使い方は、下記のようにします。
struct timeval t; gettimeofday(&t, NULL); cout<< t.tv_sec + (double)t.tv_usec*1e-6<<" sec"<<endl;
インテルコンパイラの場合、INCLUDE環境変数ではなく、CPATH、C_INCLUDE_PATH、CPLUS_INCLUDE_PATHに追加する。
手動で追加する場合は-I pathで指定する。
#include <iomanip> cout<<std::setprecision(20)<<t<<"\t"<<x<<endl;
この方法は、当然ofstreamなどにも使えます。
endlやflushメソッドは、バッファを空にしても、それがOSのキャッシュに残ってしまうかもしれない。完全に書き込むには、fsyncを使う。ただしこれはfopenでファイルを開く。Cでのみ使える。C++のofstreamには、ファイル記述子がないので、一旦closeを呼び出すのが簡単。もしくは、fopenを使った独自のクラスを書く以外にない。
pubsetbufを使う。pubsetbufがC言語のstdioのsetvbuf関数に相当する。
スペースが重要。
Array of StructureではなくStructure of Array(AoS)を使います。これは、たとえSSEを使わない場合でも、メモリアクセスが高速化される。
#include <unistd.h>をインクルードする。
sleep(1)で一秒間眠る。
通常のsleep関数は、引数の数値は秒を表す。例えば
sleep(1);
は1秒間プログラムを停止する。これ以下の間隔でプログラムを停止したい場合、nanosleep()を使う。
通常、クラステンプレートはヘッダファイルに本体も書かないとコンパイル時にエラーになってしまう。
すなわち、ヘッダhファイルとcppファイルという形で書くことが通常できない。
分割して書きたい場合は、cppファイルの最後に下記のようなものを入れておく。
template class foo<double>; template class foo<float>;
ここではdoubleとfloatだけしか書いていないが、例えばintなど他の型を取る可能性がある場合はすべて列挙しておく。
なお、列挙した分だけコンパイルに時間もかかる。
逆に言えば、不特定の型を仮定する場合はこの方法は使えない。
makeを使ってコンパイルする際に、例えば.cや.cpp、.oといった拡張子は、あらかじめ登録されている。具体的には
$make -p -f /dev/null | less
というコマンドで、その一覧を知ることができる。
この中に登録されていない、拡張子、例えばWindowsのコンパイラでよく使われる.objなどの拡張子を使いたい場合は、Makefileの中で登録しておく必要がある(そうしないとうまくコンパイルされない)。具体的には、Makefileの中で
.SUFFIXES:.obj
と言う一行を追加する。
最終更新日