yohhoyの日記

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

2012-01-01から1年間の記事一覧

GCC 4.7.0のTransactionalMemoryサポート

GCC 4.7から実験的サポートが始まったTransactional Memory(TM)についてメモ。主に "Draft Specification of Transactional Language Constructs for C++, Version 1.1"*1 で定義される拡張キーワードのsyntaxサポート確認を行った。 TMサポートの有効化 GCC…

C++標準文字列:c_str, data, operator[]

C++

C++標準ライブラリ文字列クラステンプレーstd::basic_stringのメンバ関数c_str, dataおよびoperator[]の仕様ついてメモ。 basic_string の data と c_str の挙動の変更 C++03 では c_str メンバ関数の返す文字列は null 終端されていることが保証されていま…

f()とf(void)

C++

C++言語における引数を取らない関数のパラメータリスト。f1とf2の関数シグネチャは同一。 int f1(); int f2(void); int (*pf)(void) = f1; // OK int (&rf)() = f2; // OK パラメータリスト中でvoid型を使えるのは“空のパラメータリスト”を表す場合のみ。 in…

参照渡し or 値渡し?

C++

C++03/11における関数の引数型とコピー/ムーブ処理コストとの関係について。本記事の内容は C++Now 2012 Keynote: "Moving Forward with C++11" スライド資料(Part I, Part II) に基づく。(Part IIのpp.22-57)型Tに対する変更操作を行う関数において、引…

ムーブ不可&コピー不可なオブジェクトを扱う

C++

C++11でムーブもコピーもできないオブジェクトを扱う方法についてメモ。(エッセンスのみ。詳説は元記事を) 実は C++0x では、こういう「コピーもムーブも出来ないオブジェクト」であっても、 uniform initialization を使えば、関数から返すことができるよ…

メモリモデルとThin-air read

C++

C++11メモリモデルと、atomic変数relaxedメモリ操作で起こりえる "Thin-air read" への対策について。注意:本記事は内容を理解して書いたわけでなく、関連情報の単なるメモ。 "Thin-air read"(または "out-of-thin-air value")は定式化されたメモリモデル…

shared_ptrとスレッド安全性

C++11標準ライブラリのスマートポインタstd::shared_ptrでは、C++標準ライブラリの既定レベルのスレッド安全性(→id:yohhoy:20120513)を提供する。 同一オブジェクトを指していたとしても、異なる2つのshared_ptrオブジェクトは異なるスレッドからそれぞれ…

C++11標準ライブラリのスレッド安全性

C++

C++11標準ライブラリが提供する機能とスレッド安全性(thread safety)についてのメモ*1。C++03以前では処理系依存。要約:C++標準ライブラリのオブジェクトでは、少なくとも言語組み込みint型と同様のスレッド安全性を提供する。 基本的なスレッド安全性 C++…

detachスレッドとプログラム終了処理

C++

C++11におけるdetach済みスレッドとexit関数で引き起こされる問題についてメモ。あるスレッドでstd::exit関数が呼ばれて終了処理中に、残存するdetach済みスレッドがライブラリ関数を呼び出して未定義動作を引き起こす危険性がある。下記の回避策がありえる…

C++11標準ミューテックスとtry_lockの微妙な話

C++

C++標準ライブラリが提供するミューテックス型*1に対するロック試行操作try_lockメンバ関数は、ロック獲得可能なときでも失敗する可能性がある(spurious failure)*2。N3337 30.4.1.2/p16より引用。(下線部は強調) 16 Effects: Attempts to obtain ownershi…

nullptr推奨@C++11

C++11で新たに追加されたnullptrキーワード(→id:yohhoy:20120503)利用促進のため、gcc 4.7から新しい警告オプション -Wzero-as-null-pointer-constant が追加された。 C++ A new command-line option -Wzero-as-null-pointer-constant has been added to w…

どれがコピー/ムーブコンストラクタ?

C++

C++11言語仕様において、どのようなコンストラクタが “コピーコンストラクタ”/“ムーブコンストラクタ” とみなされるのかについてメモ。 コピーコンストラクタ 第1引数にX&, const X&, volatile X&, const volatile X&のいずれかをとる非テンプレートなコン…

条件変数とダンス(Two-Step Dance)を

条件変数(condition variable)同期プリミティブに対する待機/通知で発生する現象と回避策のメモ。条件変数とミューテックスを使ったコードにおいて次のような現象が生じる。 スレッドAが条件変数cvに対して通知を行う。 条件変数cvに対してブロックされてい…

nullptrキーワード

C++

C++11で新たに導入されたnullptrキーワードおよびstd::nullptr_t型に関するメモ。まとめ: nullptrキーワードはヌルポインタ定数を表すポインタリテラル。C++03以前の値0, マクロNULLとは別に新たに追加された。 nullptrの型はstd::nullptr_t型と定義される…

リスト内包表記と変数スコープ

プログラミング言語Pythonにおけるリストの内包表記と変数スコープの関係についてメモ。 x = 42 a = [x for x in range(1,10)] print(x) Python 2.x系: 9 2020-01-01をもって Python2はEOL Python 3.x系: 42 In Python 2.3 and later releases, a list compr…

What's SSO?

C++

C++文字列クラス(std::string)の文脈における略語 SSO についてメモ。Small String Optimizationの略。文字列クラスの内部実装において、小さな文字列に対しては動的メモリ確保を避けるような最適化手法のこと。実際にそのような最適化が行われているか否か…

C++11とBoost.ThreadのMutex/Lock比較表

C++11標準ライブラリで新たに追加された排他制御ライブラリ/標準ヘッダ<mutex>と、Boost.Threadライブラリ 1.49.0の比較一覧表。C++11とBoost.Threadライブラリでは、いくつかのLockable要件(requirements)*1を定義し、各種Mutex型およびLockオブジェクトを提供す</mutex>…

C++11正規表現ライブラリ

C++

C++11標準の正規表現ライブラリでは6種類の正規表現文法をサポートする。既定値はECMAScript(+一部変更)となっている。N3337 28.5.1/p1より引用。 The type syntax_option_type is an implementation-defined bitmask type (17.5.2.1.3). Setting its ele…

C++スレッド遅延開始の実装5パターン

本文こちら→C++スレッド遅延開始の実装5パターン - yohhoyの日記(別館)コード:https://gist.github.com/yohhoy/2421197

Effective C++11(の種)

C++

Scott Meyers氏によるEffective C++11ネタ集を見つけたのでInitial Thoughts on Effective C++11より抄訳。2014-03-23追記:本記事の内容はBook Report: New Title, New TOC, New Sample Itemにてアップデートされている。(2013-03-25 Effective C++11: Con…

(翻訳)C++11の非同期タスク:まだその域に達していない

C++

元記事:Async Tasks in C++11: Not Quite There Yet | Corensic, Bartosz Milewski氏, 2011/10/10自分自身の理解のために日本語訳を行ったC++11標準ライブラリstd::asyncとタスクベース並列に関する記事。 C++11の非同期タスク:まだその域に達していない …

C++トランザクショナルメモリ拡張まとめ(ドラフト仕様v1.1)

プログラミング言語C++のトランザクショナルメモリ(TM; Transactional Memory)拡張に関するざっくりまとめメモ。2013-10-05追記:本記事の内容はN3718にてアップデートされている。→id:yohhoy:20131005本記事の内容は、2012年4月現在の最新ドラフト仕様 “Dra…

(翻訳)C++トランザクシショナル言語構成要素のドラフト仕様 V1.1 [§1-2のみ]

元文書:Transactional Memory Specification Drafting Group, "Draft Specification of Transactional Language Constructs for C++"*1, Version 1.1, 2012/2/3訳出メモ: 次世代C++1y標準のトランザクショナルメモリに関するドラフト仕様を一部翻訳。[§1.…

sizeof演算子とオペランドの評価

C C++

プログラミング言語C/C++言語では、sizeof演算子のオペランドは評価されない(evaluated)。 int a = 42; size_t n = sizeof(++a); // 式(++a)は評価されない assert(a == 42); C++11 JTC1/SC22/WG21 N3337 5/p7, 5.3.3/p1より部分引用。 In some contexts, un…

Boost.Contextでファイバーライブラリを実装してみた

長いのでこちら→Boost.Contextでファイバーライブラリを実装してみた - yohhoyの日記(別館) ライブラリコード:https://gist.github.com/yohhoy/2318086 サンプルコード:https://gist.github.com/yohhoy/2342248

to_string関数

C++11標準ライブラリに新しく追加されたstd::to_string関数についてメモ*1。組み込み数値型(intやdouble)から文字列クラスstd::stringに変換する。変換処理はsprintf相当で行われる(書式指定文字列については後述)。 #include <string> auto s1 = std::to_string</string>…

C++11でのちょっとした言語仕様変更とSafe bool Idiom

C++

C++11言語仕様ではif/for/while/do-while構文における条件部(condition)の扱いが微妙に変更された。また、これに関連してC++標準ライブラリのインタフェースも一部変更されている。(→[id:yohhoy:20120406:p1]など)この仕様変更により、C++98/03における…

C++標準I/Oストリームと暗黙型変換の落とし穴

C++

C++標準ライブラリのI/Oストリームにある暗黙のユーザ定義変換(user-defined conversion)のせいで、プログラマが意図しない動作を引き起こすケースがある。 #include <iostream> int main() { std::cout << std::cin; // ?? } 上記コードは正常にコンパイル可能。gcc 4</iostream>…

(翻訳)良性データ競合は有害である

元記事:Benign Data Races Considered Harmful | Corensic, Bartosz Milewski氏, 2011/6/7自分自身の理解のために日本語訳を行ったC++11でのデータ競合に関する記事。(タイトルはいわゆる"〜 Considered Harmful"ネタ) 良性データ競合は有害である 最近、…

(翻訳)良性データ競合へのC++的対応

C++

元記事:Dealing with Benign Data Races the C++ Way | Corensic, Bartosz Milewski氏, 2011/5/9自分自身の理解のために日本語訳を行ったC++11のデータ競合に関する記事。 良性データ競合へのC++的対応 データ競合(data race)は未定義動作(undefined behavi…