c/c++

Linuxカーネルのソースコードを読む方法(その4: list.h 後編)

Linux カーネルのソースコードを読んだのでメモを公開します.Linuxカーネルを読む際の参考になれば幸いです. お題: list.h 前回の続き,リスト構造の実装です.前回のエントリはこちら http://pyopyopyo.hatenablog.com/entry/2019/06/30/150000 リストの…

Linuxカーネルのソースコードを読む方法(その3: list.h 前編)

Linux カーネルのソースコードを読んだのでメモを公開します.Linuxカーネルを読む際の参考になれば幸いです.今回のお題: include/linux/list.h 今回はカーネル内部で多用されているデータ構造の一つとして linked list の実装を読みました.主なファイルは …

コンパイラのAddressSanitizerを使ってバッファ オーバーフローを退治する

C言語やC++の欠点の一つは,バッファオーバーフローやオーバーランが起こりやすいことです.それは欠点であると同時にC/C++の利点であると言う人もいます.つまり,メモリ関連のチェックを省略することで,省略した分C/C++はオーバヘッドが少ない高速なプロ…

glibc でバックトレースを表示する方法(その2)

C/C++で関数を書きました.デバッグに超便利なので,まるごと公開します.backtraceを取得して,FILE* に出力します.出力時の書式は format の引数で変更できます.CおよびC++両方に対応しています. C++のシンボル名は,自動で demangle(デマングル)します…

複数の静的ライブラリ (.a) を結合する方法

(2019年11月15日,更新) 改訂版を新しく書きました pyopyopyo.hatenablog.com 2つの static library, libX.a と libY.a を結合して libZ.a を生成するには $ ar cqT libZ.a libX.a libY.a で一旦 thin archive形式の libZ.a を生成し, $ echo "create lib…

ユニークなシンボルを自動生成

デバッグ用のマクロ等で時々必要となる,ユニークなシンボル名(関数名とか変数名)を自動生成するマクロ #define CAT_I(a,b) a##b #define CAT(a,b) CAT_I(a,b) #define UNIQSYM(tag) CAT(tag, __LINE__) 使い方はこんな感じ int UNIQSYM(hogehoge) = 123; こ…

dereferencing type-punned pointer will break strict-aliasing

dereferencing type-punned pointer will break strict-aliasing の警告を回避する方法.C/C++では,以下のようなType-punned pointerを使うコードは,厳密には動作が保証できない. float f = 123; uint32_t u = *(uint32_t*)&f; このようなコードは,例え…

32bit/64bit 両対応な printf の書き方

32bit/64bit両対応のコードを書いていると,よく printf() で引っかかります."%d"のような"書式"がややこしいからです.というわけで,変数の"型"と"書式"の対応を,表で整理してみました. 型 書式 注意事項 ssize_t %zd size_t %zu intmax_t %jd uintmax_…

crcの計算

c++ で CRCを計算するコード.boost の crc.hpp を使います #include <iostream> #include <cassert> #include <boost/crc.hpp> using namespace std; int main() { const char *data = "hello boost/crc.hpp"; const size_t len = sizeof(data); // CRC-CCITT boost::crc_basic<16> crc1( 0x10</boost/crc.hpp></cassert></iostream>…

boost/accumulators

C/C++で、平均値、最大値、最小値、分散、中央値等の統計量を計算するなら、boost::accumulators が便利。2017年6月13日追記.情報が古かったので更新しました #include <iostream> #include <boost/accumulators/accumulators.hpp> #include <boost/accumulators/statistics.hpp> using namespace boost::accumulators; int main() { accumulato</boost/accumulators/statistics.hpp></boost/accumulators/accumulators.hpp></iostream>…

boost/format.hpp

iostream って使いにくい。特に浮動小数点数を使う時は printf系に分がある気がする。たとえば以下のCのコードも #include <stdio.h> int main() { printf("%10d\n", 12345); printf("%10.3f\n", 12.345); printf("%10.6f\n", 12.345); return 0; } std::cout を使う</stdio.h>…

最近のdoxygenはスゴイ

doxygen*1 と言えば、cやc++のソースコードからドキュメントを自動生成する便利なソフトウェアです。この doxygen、ここ1年ぐらいですごく改良されています。ちょうど昨日(2010/6/15)に最新版の 1.7.0 がリリースされたので、この機会に最新版に乗り換えて、…

gcc 4.5.0 リリース

今日明日にも GCC 4.5.0 がリリースされる模様。 ミラーに行き渡ったら、正式にアナウンスされるとのこと。http://gcc.gnu.org/ml/gcc/2010-04/msg00321.htmlすでに http://gcc.gnu.org/ の更新は終わっており、Current release series は、 GCC 4.5.0 とな…

visual c++ で M_PI とか M_LOG2E を使う方法

windows の visual c++ (visual studio)で、M_PI や M_LOG2E のような定数を使う場合は #define _USE_MATH_DEFINES #include <math.h> と、math.h をincludeする前に、_USE_MATH_DEFINES を定義する。参考 http://msdn.microsoft.com/ja-jp/library/4hwaceh6.aspx</math.h>

NANの定義について

gcc環境だと math.h に NAN という定数が定義されている。ところが visual c++ (visual studio)には対応する定義が無い。環境に依存しない、ポータブルな、移植性の高いコードが必要な場合は、STLを使って #include <limits> std::numeric_limits<float>::quiet_NaN(); std:</float></limits>…

Visual C++で、std::min, std::max を使う方法。

visual c++ (Microsoft Visual Studio)では、std::min(), std::max() が使えない場合がある。これは windows.h に昔から定義されている min、 max というマクロがあり、これと名前が衝突するため。回避方法は #define NOMINMAX #include <windows.h> と NOMINMAX を定義</windows.h>…

c/c++で MySQL を使う方法

c/c++ で mysql のデータベースへアクセスする方法をまとめます。rubyやphpと比べるとc/c++でのコーディングはかなり面倒ですが、うまく記述できればパフォーマンスがかなり向上できるようです。参考URL http://dev.mysql.com/doc/refman/5.5/en/c.html c/c+…

boostのインストール方法(windowsの場合)

Windowsに、boostのライブラリとヘッダファイルをインストールする方法です。 ライブラリのビルド 先ず以下の手順で ライブラリをビルドします。 予め Visual studio express edition 等の開発環境をインストールしておく http://www.boost.org/ から最新の…

boostのcondition variable(条件変数)

Linuxだと pthread_cond_wait() つまり POSIX系、 Windows だと WaitForSingleObject() つまり Win32APIと、スレッドまわりのAPIはOSによって使い分ける必要があります。これは面倒くさい!!そういう場合は boost の boost::thread 一派が便利です。たとえば…

GCC 4.4 情報

GCCの次期バージョン 4.4 系ですが、ついに rc1 がリリースされました。そこで実際にGCC 4.4.0-rc1 を試し、変更点・残っているバグなどを調べてみました。なお、オフィシャルなドキュメントは以下のURLにまとめられています。 http://gcc.gnu.org/gcc-4.4/c…

super pi を作ろう

円周率πを100万桁まで計算するプログラムを作ってみました。super pi もどきです。ソースコードと解説を載せます。ソースコードは80行程度の非常に短いものですが、このような簡単な実装でも最近のPCなら100万桁の円周率が一分も掛らず計算できます。 ポイン…

任意精度計算ライブラリ(GMP)の使い方

プログラミング時に注意すべき点の一つに,計算精度の問題があります.たとえばC/C++だと,doubleで計算しても有効桁数は15桁程度(10進数で)しかありません.その結果,以下のような状況で間違った計算結果が出てしまいます. 取り扱う数値が15桁を越える場…

C言語で、ruby用拡張モジュールを作成する方法

C言語で、rubyの拡張モジュールを作成する方法について調べてみました。とりあえず例として Sample という拡張モジュールを作成し Sample::sample() というメソッドをCで実装 してみました。このSampleモジュールを使うと、以下のrubyのコードは require "sa…

c++のデバッグをするならgdb-6.8を使いましょう。

2008年の3月にリリースされたgdb-6.8の目玉機能の一つに「C++サポートの強化」があります*1。この機能を使うと、STLやboostのようなテンプレートを使ったコードのデバッグがかなり楽になります。C++使いの方は、是非gdbを6.8にupgradeしましょう。具体的に、…

GCC 4.3 情報

GCCの次期バージョン GCC 4.3 がそろそろリリースされそうです.そこで実際に開発版のGCC 4.3を試し,変更点・残っているバグなどを調べてみました.変更点・改良点は http://gcc.gnu.org/gcc-4.3/changes.html にまとめられています.以下,GCC 4.3のsnapsh…

intel compiler v.s. gcc

intelコンパイラの最新版10.1が入手できたので,久しぶりにベンチマークを取ってみた.比較対象は intel compiler (ICC) version 10.1 20070913 gcc-4.2.2 gcc-4.3.0 (snapshots/20071020) これらのコンパイラで手元にあった数値計算のコードをビルドし,生…

ブレセンハム(Bresenham)のアルゴリズム

FizzBuzz問題の次の問題として,直線の描画アルゴリズムなんてどうだろう?直線描画のアルゴリズムといえばブレセンハム(Bresenham)のアルゴリズムが有名.知っていると知らないでは雲泥の差.試行錯誤するもよし,そのままブレセンハムを実装するもよし.力…

STLのalgorithm,functorの使い方.

STLのalgorithm,functor 関連をシンプルに整理してみました.以下,文中の op は関数オブジェクト T, T1,T2 はtypename a, b はT型の定数 x, y はT型の変数 or 定数 Ite,first, last はイテレータ とします. equal_to, not_equal_to, greater, less, grea…

c++で階乗を計算

テンプレートメタプログラミング(template metaprogramming)で,20の階乗を計算するコード. #include <iostream> using namespace std; template <int64_t N> class X { public: int64_t operator()(){ return X<N-1>()() * N; } }; template <> class X<1> { public: int64_t operato</n-1></int64_t></iostream>…

c/c++でsqliteを使う方法

sqlite3をc/c++で使う方法についてメモ。以前ruby で sqlite を使う方法 - ぴょぴょぴょ? - Linuxとかプログラミングの覚え書き -でも書いたように、DBを使うアプリケーションは、通常はrubyなどのスクリプト言語で記述したほうが楽です。でもc/c++からもデ…