yohhoyの日記

技術的メモをしていきたい日記

2012-02-01から1ヶ月間の記事一覧

続 restrictキーワード

C

C99で導入された restrict キーワードに関するメモ。restrictキーワード の続き。 読込アクセスとalias restrictポインタが指すオブジェクトに対して変更(書き込み)を行わなければ、restrictポインタ同士が同一オブジェクトを指していても良い。下記コード…

ワイルドカードの展開

Pythonでファイル名のワイルドカード展開を行う。 # expand_wc.py import sys, glob, operator print sys.argv[1:] # 展開前 sys.argv = reduce(operator.add, map(glob.glob, sys.argv)) print sys.argv[1:] # 展開後 実行結果: $ ls abc.txt xyz.txt expa…

電子書籍"The New C Standard"

C

C99規格書の全ての文章*1に注釈を加えた電子書籍を無料でダウンロード可能。PDF形式。1600頁超。 The New C Standard - An Economic and Cultural Commentary, Derek M. Jones 下記のamazon.comレビューにある通り、作者本人による正規配布とのこと。なにや…

restrictキーワードへの対応状況

C99で導入された restrict キーワード(→id:yohhoy:20120223)への対応状況メモ。 gcc系 gccはC99の restrict キーワードに対応している。また、C++でも利用可能な独自の __restrict__, __restrict キーワードを提供しており*1、C/C++のポインタ型と参照型お…

Declaration or Expression?

C++

プログラミング言語C++の文法では、宣言(declarations) と 式文(expression-satements) が曖昧になる箇所がある。なおプログラミング言語Cの文法にはこの曖昧さは存在しない。 struct X { X(); //... }; // X型の変数xをデフォルトコンストラクタで構築... …

C標準ライブラリとC++の例外伝搬

C C++

C++例外伝搬と(C++標準規格に含まれる)C標準ライブラリの関係についてメモ。*1 C標準ライブラリ関数からは例外throwを行わない。(noexcept指定がされているとみなしてよい) ただしユーザ定義関数のコールバックを行う標準ライブラリ関数は特例。qsort, b…

restrictキーワード

C

C99で追加された restrict キーワードについてのメモ。コンパイラに対して「aliasが存在しないと仮定した最適化を許す」と伝えるためのキーワード。C99以降でのみ有効なキーワードであり、C++11現在でもC++には同キーワードが存在しない。(ただしコンパイラ…

ローカルクラスとテンプレート引数

C++11から、テンプレート引数として関数内のローカルな型を指定できるようになった。(C++03以前ではNG) template <typename T> void foo(T const& t) {} struct X{}; int main() { struct Y{}; foo(X()); // C++03/C++11:well-formed foo(Y()); // C++03:ill-formed, C</typename>…

(翻訳)C/C++のStrict Aliasingを理解する または - どうして#$@##@^%コンパイラは僕がしたい事をさせてくれないの!

元記事:Understanding C/C++ Strict Aliasing, or - Why won't the #$@##@^% compiler let me do what I need to do!, Patrick Horgan氏訳出メモ: 自分自身の理解のために日本語訳を行ったStrict Aliasing Rules解説記事。 訳文中では "aliasing/alias", "…

tieを用いた比較演算子の実装

C++

C++11標準ライブラリで追加されたタプルを利用し、ユーザ定義型の比較演算子を簡単に実装する方法。 #include <tuple> // ユーザ定義型 struct Person { std::string lname; // last name std::string fname; // family name int age; }; bool operator<(const Pers</tuple>…

Boost.Asioでお手軽並列ライブラリを実装

Boost.Asioを使って、スレッドプールを利用した簡単な並列アルゴリズムを実装してみた。名前は適当にTiny Parallel Library(むしろ"Toy"の方が似合う気がする)。 概要 実装した並列アルゴリズムは下記3つのみで、インタフェースはIntel TBBおよびMicrosoft…

printfとsize_t型

C99にてsize_t型用の書式化文字列 長さ修飾子(length modifier)zが追加された。 #include <stdio.h> printf("%zu\n", sizeof(int)); なお、同時にptrdiff_t型用の長さ修飾子tも追加されている。 gcc系 gcc(glibc 2.1以降)はzに対応している。ただし、厳密なC90(-peda</stdio.h>…

括弧を使ったADL回避

C++

本の虫: ADLへの対処方法で見かけた、下記の「括弧を使ったADL回避」に関するメモ。 ADLを回避する方法として、括弧を使う方法がある。 (print)( x ) ; N3337を調べたら3.4.2/p1に直接例示があった(下線部が根拠)。関数名を括弧で括ることでunqualified-id…

マルチスレッドprintfデバッグのお供

C++

マルチスレッドプログラムで printf デバッグをする際に、出力文字列が混ざらないよう排他制御を行うコード記述方法に関するメモ。本記事では排他制御に関するテクニックに限定し、保守性よりも記述の手軽さを重要視している。(Boost.Formatなどログ出力部…

非メンバ関数版 begin/end のすゝめ

C++

C++11では新しく非メンバ関数のstd::begin, std::endが導入された。Elements of Modern C++ Style では、コンテナクラスcのメンバ関数c.begin(), c.end()ではなく、常に非メンバ関数版を利用するよう推奨している。 #include <vector> std::vector<int> v; int a[100]; st</int></vector>…

threadの利用と例外安全(その3)

C++11標準ライブラリとBoost.Threadライブラリ(Boost 1.48.0)に含まれる、threadオブジェクトのデストラクタの振る舞いと例外安全に関するメモ。その1, その2 の続き。2020-12-02追記:C++2a(C++20)標準ライブラリでは、デストラクタで自動的にjoinを呼び…

threadの利用と例外安全(その2)

C++11標準ライブラリとBoost.Threadライブラリ(Boost 1.48.0)に含まれる、threadオブジェクトのデストラクタの振る舞いと例外安全に関するメモ。その1 の続き。2020-12-02追記:C++2a(C++20)標準ライブラリでは、デストラクタで自動的にjoinを呼び出すstd:…

threadの利用と例外安全(その1)

C++11標準ライブラリとBoost.Threadライブラリ(Boost 1.48.0)に含まれる、threadオブジェクトのデストラクタの振る舞いと例外安全に関するメモ。2020-12-02追記:C++2a(C++20)標準ライブラリでは、デストラクタで自動的にjoinを呼び出すstd::jthreadが追加…

threadのdetachとデストラクタ

C++

C++11標準ライブラリに追加されたstd::threadとBoost.Thread提供のboost::threadでは、デストラクタの動作仕様が少し異なる。(Boost 1.48.0を対象とする)2020-12-02追記:C++2a(C++20)標準ライブラリでは、デストラクタで自動的にjoinを呼び出すstd::jthre…

C++11 FuturesとBoost.Thread Futuresの比較

C++11標準ライブラリで新たに追加された Futuresライブラリ/標準ヘッダ<future>と、Boost.Threadライブラリ(Boost 1.48.0) の機能比較。両者のFutures機能*1が提供するクラスと関数の対応関係を下表にまとめる*2。C++0xドラフト段階からBoost.Threadライブラリをベ</future>…

asyncについて(実践編)

C++11標準ライブラリのstd::async関数を実際に利用するときの注意点メモ。2012年2月現在の結論: gccのasync関数はプログラマが期待するような賢い動作をしない。 MSVCは問題外(async関数自体をサポートしない)。次期MSVC11に期待。 サードパーティライブ…

asyncについて(理論編)

C++

C++11標準ライブラリで新しく追加されたstd::async関数についてメモ。 asyncの基本 asyncは関数オブジェクトの非同期処理機構*1を提供する関数テンプレート。async関数はstd::futureオブジェクトを返すため、同オブジェクトを介して処理完了待ちと処理結果の…

packaged_taskについて

C++

C++11標準ライブラリで新しく追加されたstd::packaged_taskについてメモ。 関連記事:id:yohhoy:20120131, id:yohhoy:20120201 packaged_taskの基本 packaged_taskは関数オブジェクト*1を “非同期タスク” として保持するクラステンプレート。packaged_taskが…

futureとshared_future

C++

C++11標準ライブラリで新しく追加された std::shared_future についてメモ。id:yohhoy:20120131の続き。 shared_futureとfutureの関係 std::shared_futureは同一のshared stateを参照するコピー可能なクラステンプレート。複数スレッドから同じ処理結果を取…