Chiharu の日記

絵描き C/C++ プログラマーの日記です。

C++

バリアントの配列

C++

バリアントの配列を文字列から生成して遊んでみました。テンプレートを使うと型情報による switch & case がなくて気持ちいいですね。C++17 以降の環境なら Variant には std::variant<> を使うべきでしょうけれども。 #include <string> #include <sstream> #include <vector> #inclu</vector></sstream></string>…

Linux の eventfd を Win32 イベントオブジェクトのように使う

C++

Linux の eventfd を Win32 イベントオブジェクトの SetEvent(), ResetEvent(), WaitForSingleObject() のように使いたかったので、やってみました。生成時に EFD_NONBLOCK を指定して、待機を select() で実施するのがポイントですね。 #include <sys/eventfd.h> #include <sys/select.h></sys/select.h></sys/eventfd.h>…

並列処理いろいろ

C++

HPC の素人が並列処理を調べてます。ロードバランサーやアプリケーションインスタンスを複数起動する的なフロントエンドではなく、ネイティブコードで SIMD・スレッド並列・プロセス並列・GPGPU・MIC・クラスターにより並列処理するバックエンドの方です。x8…

オーバーヘッドの少ないスレッドローカルストレージを考える

C++

スレッドローカルストレージの利用に際して、POSIX も Win32API も、値の取得と設定にシステムコールなりのオーバーヘッドがかかりますが、グローバル変数のような気軽さで頻繁にアクセスしたい場合、このオーバーヘッドが許容できないことがあります。とい…

Cygwin の fork() は遅い?

C++

Cygwin で fork() の時間を調べてみました。Core i7 + SSD の実測で 1 呼び出しあたり 2ms くらいでした。vfork() でなく fork() でも似たり寄ったりです。/bin の各ツールが Windows におけるスレッド起動のノリで fork() を使うことを考慮すると、遅い、の…

Cygwin の stat() が遅い

C++

Cygwin の stat() が遅いなぁと思って、高速版を実装してみました。 コードは下記の通りです。st_dev や st_ino に有効値を設定しなかったり、パス変換が厳密でないなどの制限により用途は限定されますが、ディレクトリーとファイルの判別や、タイムスタンプ…

メモリーよりもディスクが速いわけがない

C++

その結果、Javaで1バイトの文字列を結合処理してからディスクに書き込んだ場合、ディスクへの直接書き込みと比べて約9,000倍の時間がかかったという。 http://developers.slashdot.jp/story/15/03/28/0747218/ 元記事の Java コードを読みました。C 言語的に…

PNG 並列圧縮ドラフト 〜libpng 並列処理

C++

こちらに触発されて、libpng による並列出力にトライしています。下記のような I/F で画素データの並列出力ができると取り回しがいいかなぁ、と思っています。 typedef struct ppng ppng; typedef enum ppng_result { ppng_result_succeeded, ppng_result_ou…

ショート コーディング for ARM Bin. 〜課外活動

C++

仲間内の勉強会で、C コンパイラのビルド結果として ARM バイナリをできるかぎり短く実装しようというショート コーディングっぽいことをやってみました。 お題 テスト コードで“succeeded.”が表示されるよう下記の関数を実装してください。 const char* q_s…

cparser パッケージ 〜レキサー実装完了

先日の日記の続き。 レキサーの実装を完了しました。ダウンロードはこちらから。意外とすんなり実装できました。また、実装中に一部のクラス構成を修正しました。正規表現と文字列比較の切り替えをコードから自明な感じにしてみました。 実装については 1 行…

cparser パッケージ 〜レキサー設計

先日の日記の続き。 こちらのサイトを眺めていたら、レキサーを自作できそうな気がしてきたので、設計してみました。 汎用部品をクラス図に起こしてみました。C++11 だと std::regex があるため結構気軽に文字列解析できますね。cparser::Lexer::Lexer() に…

cmeta パッケージ 〜実装完了

先日の日記の続き。 とりあえず、クラス図に起こした分だけ C++ で実装しました。ダウンロードはこちらから。実装中、クラス図中のコピー可能なすべてのクラスのメンバに swap が不足していることに気づきました。あぁ。例外安全。最近 C 言語ばかり触ってい…

C to XMI 〜まずはメタ構造を

最近、ある種のコーディング規約で実装された OOP っぽい C コードをクラス図へリバースしたい状況があって、ずっと手作業をしていたのですが、いい加減、面倒くさくなってきて、ツールを自作しようかどうか悩み始めています。 さしあたって、C コードから静…

Visual Studio 11 〜インストールしました

C++

Visual Studio 11 Beta Professional をインストールしてみました。 インストール中に子供の相手をしていたら PC がスリープしてしまったみたいで、インストールの最後でエラーダイアログが表示されていました。再起動したら普通に使えるようでしたので、そ…

読み方が分からないプログラミング用語 〜活字で勉強しているとどうしてもね

C++

RAII : 『あーるえーあいあい』でいいのかな? C++11 : 『しーぷらすぷらすじゅういち』でいいのかな? OOP : 『うーぷ』『おーおーぴー』どっちだろう? ――といった感じで、読み方に自信がない単語が色々あります。

UTF-8 から UCS-4 を取り出す 〜エンコーディングから文字コードへ

UTF-8 から UCS-4 を取り出す処理が必要になりました。ということで、書いてみました。下記。 const std::uint32_t toUcs4(const char* iString, const std::size_t iLength, const char** oEnd) { assert(iString); assert(oEnd); const char* aCur = iStri…

astah* 〜ライセンス

先ほど『Parallel force - パラレル・フォース』の設計メモとして astah* を使おうと思ったところ、評価ライセンスの期限が切れていることに気づきました。しまったなぁ。会社に個人ライセンスがあるので、それを使い始めるまでのつなぎにしていたら、ライセ…

memcpy 〜ARM アセンブラは短いね

いきなりですが ARM アセンブラの話でも。 memcpy の亜種(戻り値なし、必ずコピー発生)を C 言語で、ARM が得意なコード サイズ重視の書き方で書くと、 void my_memcpy(void* dst, const void* src, size_t size) { uint8_t* dstC; const uint8_t* srcC; a…

PandaBoard 環境にポーティング完了 〜スクリーンショット

先日の日記の続き。 Ubuntu 11.04 on PandaBoard 上で自作ゲーム エンジン『Parallel force - パラレル・フォース』が動作しました。 とりあえず OMAP4 の ARM Cortex-A9 を 2 コアちゃんと叩いてくれているみたい。んー。純粋な C++ コードだと Intel Atom …

たいぽ 〜会社で

C++

誤: queing 正: queuing そもそも que でなく、queue なのだから“u”が付くのは当たり前。あー。頭が寝ていたんだな。多分 STL の deque に惑わされたのです…(言い訳

パッケージ図 〜AICS4 で描いてみました

先日の日記の続き。 『Parallel force - パラレル・フォース』のパッケージ図を Adobe Illustrator CS4 で描いてみました。 ドキュメントとしてまとめる分には astah* のカラーでぜんぜん問題ないのですが、PowerPoint やウェブ上で提示する資料としては、こ…

パッケージ図 〜astah* で描いてみました

『Parallel force - パラレル・フォース』のパッケージ図を astah* で描いてみました。 んー。職場で Visio で描く UML スケッチほどにはキレイに描けないなぁという印象です。もうちょっとフォントとか枠線の色がカスタマイズできるとか、グラデーションに 2…

条件変数 〜Win32API の場合

POSIX スレッド API には pthread_cond_t 型で提供される条件変数という機能があるのですが、Win32API では Vista になるまで当該機能が存在しなかったという話です。 条件変数は、他のスレッド ライブラリには以前から含まれていましたが、残念ながら Windo…

C++0x が C++11 へ 〜ついに国際標準!

C++

ずーっと長いことドラフトだった C++0x は、この夏に晴れて C++11 として国際標準になったようです。 我々が”C++0x”と呼んできたC++の次期改正案はついに国際標準になった! ジュネーヴのISOから発行されるのはもう数ヶ月先になるだろうが、それでも今年中に…

Linux 環境にポーティング完了 〜スクリーンショット

先日の日記の続き。 Ubuntu 11.04 (x86) (VMWare) 上で自作ゲーム エンジン『Parallel force - パラレル・フォース』が動作しました。 感無量です。ポーティング元の環境依存 API は Win32API(一部に XAudio)だけでしたが、ポーティング先は xlib、FreeTyp…

Linux 環境にポーティング 〜プログラミングメモ

先日の日記の続き。 『Parallel force - パラレル・フォース』を X-Window 環境へ移植しています。子供の相手をしながらなので休日の割に歩みが遅いですが、ぼちぼちやってます。 タイマー処理 やりたいことは ms 精度のスリープと、ms 精度の時間カウンタ取…

ストラウストラップのプログラミング入門 〜C++ によるプログラミングの原則と実践

C++

夕方に Amazon から届きました。どう見ても鈍器です。本当にありがとうございました。1000 ページを超えているので読破するまでに時間がかかりそうですが、最近は特に読むべき技術書もないので地道に読み進めていこうと思います。私が C++ スキーなせいもあ…

X-Window でマルチスレッド 〜X11 API (xlib) プログラミング メモ

『Parallel force - パラレル・フォース』のウィンドウ処理とバックバッファの転送処理を X-Window 環境に移植したのですが、X11 API (xlib) のマルチスレッドでどハマリして、解決に結構時間を使いました。以下、解決メモです。 X11 API (xlib) のスレッド…

C++0x 〜社内発表

C++

仕事で『深遠なる C++0x への招待』というタイトルで社内発表することになりました。OOP にあまりなじみのない Embedded な人たち向けなので、前半は OOP 基礎知識と C++ の紹介あたりから入ろうと思うのですが、んー。どんなバランスで発表したものやら。ま…

アフィン行列 〜イメージの変形

先日の日記の続き。 イメージの変形用にアフィン行列を定義しました。速度優先で固定小数(16.16)で実装してみました。演算子のオーバーロードで四則演算も可能。x64 のおかげで乗算時の 64bit 乗算も C/C++ で記述できるようになり、結構気軽な感じです。x…