yohhoyの日記

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

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

2012年コンテンツアクセス頻度

2012/01/01〜2012/03/31 static変数初期化とスレッドセーフ - yohhoyの日記 (翻訳)C/C++のStrict Aliasingを理解する または - どうして#$@##@^%コンパイラは僕がしたい事をさせてくれないの! - yohhoyの日記 windows.hのmin/maxマクロ回避策4パターン -…

Boost.Thread 1.52.0 condition_variableメモリ浪費問題

Boost.Threadライブラリ 1.52.0の条件変数boost::condition_variableバグ修正(#7461)でのリグレッションにより、condition_variableオブジェクトでの反復的な待機/通知処理を行うとメモリリークが発生する。WindowsシステムかつBoost 1.52.0のみ影響を受…

boolalphaマニピュレータ

C++

C++標準ライブラリが提供するstd::boolalphaマニピュレータ(manipulator)と、独自ロケール(locale)/ファセット(facet)を用いた出力文字列の差し替え。ファセットstd::numpunct<charT>のdo_truename, do_falsename仮想メンバ関数をオーバーライドして、bool値をスト</chart>…

fputcとputc

C

C標準ライブラリでは、1文字ストリーム出力関数 fputc と putc(char版)、fputwc と putwc(wchar_t版)の2種類が提供される。両関数は機能的に等価。マクロ展開によるトラブル回避のためputc/putwc利用は避け、常にfputc/fputwcを用いること。 putc()は…

SCOPE_EXIT疑似構文の作り方

C++

C++ and Beyond 2012 "Systematic Error Handling in C++"スライド「ScopeGuard11」より。マクロとラムダ式を組合せてスコープガード文を疑似的に実現している。(注意:末尾のセミコロン必須) { ... SCOPE_EXIT { /* 処理A */ }; ... { ... SCOPE_EXIT { /…

本当は怖くないムーブセマンティクス

C++

長いのでこちら→本当は怖くないムーブセマンティクス - yohhoyの日記(別館)C++ Advent Calendar 2012参加記事。

__COUNTER__マクロ

C/C++プリプロセッサにおいて、一意な識別子名生成に利用できる__COUNTER__マクロについて。非標準機能だが主要コンパイラで一通りサポートされている。 #define CAT_IMPL(s1, s2) s1##s2 #define CAT(s1, s2) CAT_IMPL(s1, s2) #ifdef __COUNTER__ #define …

static_assert+標準メタ関数

C++

C++11 static_assert条件部の定数式(constant expression)にて、標準ライブラリ提供のメタ関数を利用するときのメモ。2017-11-10追記:一部のメタ関数で意図しないコンパイルエラーを引き起こすため、このイディオムを使うべきでない。C++1z(C++17)標準ライ…

copy elision抑止オプション

gcc(g++)において、C++言語仕様で許容されているcopy elision*1を明示的に抑止するオプション。 -fno-elide-constructors The C++ standard allows an implementation to omit creating a temporary that is only used to initialize another object of the …

#pragma detect_mismatch

Microsoft Visual C++ 2010(MSVC10)以降では、リンカでの不一致検知を行うdetect_mismatchプラグマが提供される。一例として、オブジェクト間のABI(Application Binary Interface)非互換検出に利用できる。関連URL c++ - Inline namespace emulation for MSV…

無名(匿名)名前空間の不思議な定義

プログラミング言語C++における無名名前空間(unnamed namespace)*1の、一見すると不思議な(実は根拠がある)定義に関するメモ。本記事はStack Overflow上での質問と回答内容に基づく。 C++言語仕様での定義 C++03 7.3.1.1/p1では、unnamed namespaceの振る…

引数プレースホルダの衝突回避

C++11標準ライブラリとBoost.Bindライブラリが提供する、関数バインダ用の引数プレースホルダ(placeholders)に関するメモ。C++標準ライブラリとBoost.Bindライブラリを(暗黙的に*1)併用する場合、_1や_2などの引数プレースホルダ名が衝突するケースがある…

main関数のreturn省略

C C++

プログラミング言語C/C++において、main関数のreturn文を省略した場合の振る舞いに関するメモ。まとめ: C99より前では、戻り値が未定義(undefined)とされる。*1 C99以降では省略可能。「return 0;」として扱う。 C++では省略可能。「return 0;」として扱う。…

typeid演算子と参照型/cv修飾

プログラミング言語C++の typeid 演算子における、参照型および cv修飾(const, volatile)の扱いについてメモ。typeid演算子オペランドに型名(type-id)を指定する場合、下記ルールが適用されることに注意。 対象が参照型(T&, T&&)の場合、参照先の型Tとして…

条件演算子と左辺値の扱いの差

C C++

プログラミング言語C/C++における条件演算子(?:)と左辺値の扱いについてメモ。言語仕様の隅をつつく話題であり、通常はif文を利用するべき。下記コードはCでは未定義動作(undefined behavior)を引き起こすが、C++ではwell-definedであり期待通り動作する(変…

'main' is usually a function

gcc

gccの一風変わった警告メッセージ。下記コードはfalse(1)相当を実装する。 unsigned main = 3275800627u; // xor %eax, %eax ; 0x33 0xc0 // inc %eax ; 0x40 // ret ; 0xc3 // 0xc340c033 = 3275800627 gcc 4.6.3@x86環境の実行結果*1: $ gcc -Wall input…

ラムダ式のcapture-defaultとthisポインタ

C++

C++ラムダ式のキャプチャ指定において、デフォルトでコピーキャプチャ+thisポインタ[=, this]はNGだが、デフォルトで参照キャプチャ+thisポインタ[&, this]は許容される。*12018-07-03追記:C++2a(C++20)言語仕様としてP0806R2が採択され、[=]による暗黙の…

Javaのconstキーワード

プログラミング言語Javaでは const をキーワードとして予約しているが、Java SE 7現在でも何ら特定の機能を持たない*1。(恐らく将来に渡って現状のままと予測される)1999年時点でJDK 1.2.0に対する機能拡張要求 BugID:4211070 Java should support const p…

長さゼロ on 文字列/メモリ操作関数

C

標準Cライブラリヘッダ string.h, wchar.h で提供される文字列/メモリ操作関数に対し、長さ 0 を指定した時の振る舞いについて。操作対象とする文字列/メモリの “長さ” をとる関数において、該当引数に0を指定したときの振る舞いは下記の通り規定される。 …

bool型へのexplicitユーザ定義変換

C++

C++11からはユーザ定義変換に対してexplicit指定ができ、意図しない暗黙の型変換を抑止できるようになった。一方で「bool型へのexplicitユーザ定義変換」だけは、記述されている場所に応じて(コンテキストに依存して)自動的にbool型へと変換される。 class…

書籍"The Boost C++ Libraries"

書籍"The Boost C++ Libraries"の旧Edition全文がWeb公開されている。同内容はBoostライブラリ 1.42.0に基づく。Creative Commons BY-NC-NDライセンス。2014-11-01追記:Boostライブラリ 1.56.0まで対応したアップデートが行われている。 The Boost C++ Libr…

C++でCPS

C++

C++11からはラムダ式が導入され、CPS(Continuation Passing Style; 継続渡しスタイル)で簡単に記述できるようになった(と思う)。実用性の程はともかく。 #include <functional> #include <iostream> // 階乗計算 int fact(int n) { if (n == 0) return 1; else return n * fact(n</iostream></functional>…

overrideキーワード指定の強制?

C++

C++11で新しく導入されたoverrideキーワード*1に関するメモ。コーディング時のミスや設計変更により「意図せず正しいオーバーライドになっていない*2」事態を防ぐ仕組みだが、C++11にはこのoverrideキーワード利用自体を強制する機能はない。overrideキーワ…

_MSC_FULL_VERマクロ

Microsoft Visual C++コンパイラのバージョン判定マクロについて。2017-03-07追記:本ページはVC2012以降メンテナンスされていない。最新版はyumetodoさんによる _MSC_VERと_MSC_FULLVERをまとめる を参照のこと。メジャー/マイナーバージョンを判定するため…

イベントのnullチェック回避

C#

イベントに予め “空の匿名メソッド” を登録しておくことで、イベント呼び出し時にnullチェックを逐一記述する必要がなくなる。Null Objectパターン*1。 public delegate void SomeHandler(object sender, SomeEventArgs e); public event SomeHandler SomeEv…

タグ付きタプル型

C++

C++標準ライブラリやBoost.Tupleライブラリが提供するタプル型(tuple)では、タプル要素へはインデクス指定でアクセスする。タプルの要素アクセスを名前(タグ)経由で行う方法についてメモ。(機能的には普通の “構造体(struct)” に相当。) #include <tuple> std::tu</tuple>…

文字列型のnull/空文字列判定

プログラミング言語JavaやC#では文字列型=参照型として定義されるため、空の文字列""と参照先なしnullは明確に区別される。一方で処理ロジックの “有効な文字列を保持しているか?” 確認のために、文字列型の変数に対して「nullまたは空文字列判定」が多用…

文字列を含む構造体のP/Invoke

P/Invokeにおいて “メンバ変数として文字列データを含む構造体” をマネージドコード(C#)からアンマネージド(native)関数へ渡す方法メモ。注意:本記事中のC#コードでは例外安全を考慮しておらず、確保したメモリブロックのリークが発生しうる。メモ:アンマ…

C#のusingステートメント

C#

プログラミング言語C#におけるusingステートメント利用に関するメモ。基本形は下記の通り。型TはIDisposableインタフェースを実装する必要がある。 using (var t = new T(...)) { /* * tを使った処理 */ } // t.Dispose()が呼ばれる 複数リソースを扱う例: …

P/Invokeとパラメータ方向属性

C#からのP/Invokeにおけるパラメータの方向属性*1についてメモ。C#における既定の方向属性は下表のとおり。呼び出し元/呼び出し先はマネージド(C#)/アンマネージド(native)いずれかになる。つまりexternメソッド呼び出しであればC#→nativeとなり、アンマネ…