yohhoyの日記

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

gcc

参照型の{}初期化

C++11で導入されたUniform Initializationと参照型変数に関するメモ。C++11(N3337)言語仕様の問題としてCWG defect #1288で挙げられ、C++14 Draft N3376にてWording修正が適用された。*1 struct S {}; int main() { S v; S & r{ v }; // ?? } gcc gcc 4.8.2…

乱数生成器のサイズ

C++11標準ライブラリに追加された乱数生成器(RNG; Random Number Generator)のオブジェクトサイズについてメモ。注意:具体的なオブジェクトサイズは実装依存となるため、下表は各オブジェクト間のオーダー比較程度に解釈すること。 RNG gcc/64 gcc/32 Clang…

Cスタイルキャスト利用を警告

gcc(g++)において、古いCスタイルキャストが使われた場合に警告するオプション。 -Wold-style-cast (C++ and Objective-C++ only) Warn if an old-style (C-style) cast to a non-void type is used within a C++ program. The new-style casts ('dynamic_ca…

C++名前マングリングの互換性

gcc

gcc(g++)のC++名前マングリング(name mangling)では、意図的に他コンパイラシステムと異なる規則を採用している。GCCオンラインマニュアルより引用(下線部は強調)。 On many platforms, GCC supports a different ABI for C++ than do other compilers, so…

memcachedへのC++TM適用事例レポート

C++1y(C++14)に向けて提案されているC++ Transactional Memory(C++TM)拡張に関して、gccでの実験的サポートを用いた既存アプリケーション(memcached*1)書き換えに関するレポート。C++TMドラフト仕様v1.1(→id:yohhoy:20120414)に基づく。 ペーパー:(PDF)…

C/C++ char型の符号有無

プログラミング言語C/C++のchar型が、符号あり/符号なしのいずれかは処理系定義(implementation defined)*1。各コンパイラでの実装についてメモ。まとめ: char型を「符号あり(signed)」と仮定しないこと。(とはいえ、この仮定をおくコードは多い…) 特にA…

__COUNTER__マクロ

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

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 …

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

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

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

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

'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…

可変引数リストと非PODクラス型の関係

プログラミング言語C++において、可変引数リスト(...; ellipsis)をとる関数に非PODクラス型を渡した場合の振る舞いについてメモ。 void foo(int, ...); std::string s; foo(1, s); // ?? C++03 可変引数リストに非PODクラス型を渡した場合、未定義動作(undef…

古のK&R C in 2012

2012年現在のC言語コンパイラでもK&R Cソースコードを扱えるか試したのでメモ。*1結論:gccとMSVCはK&R Cソースコードでもコンパイル可能。 /* K&R style C */ int printf(); int add(); main(argc, argv) int argc; char** argv; { printf("1+2=%d\n", add(…

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…

shared_ptrとスレッド安全性

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

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…

定義済みマクロ__cplusplusとgccの長い歴史

C++言語の定義済みマクロ__cplusplusについてメモ。C++ソースコードとしてコンパイルされるときのみ定義され、C/C++言語共用ライブラリヘッダ等でよく利用される。 // C/C++共用ヘッダファイル #ifdef __cplusplus extern "C" { #endif // ここでの宣言はC言…

STLアルゴリズムのParallel Mode拡張

id:ignisanさんのC++ Advent Calendar 2011 記事で知った gcc Parallel Mode 拡張についてメモ。http://gcc.gnu.org/onlinedocs/libstdc++/manual/parallel_mode.html Runtime Library (libstdc++) An experimental parallel mode has been added. This is a…

C++11サポートを有効にしてIntel TBBをビルド

Intel TBBをgcc C++0xモード(-std=c++0xオプション付)でビルドする方法。gcc 4.6.3+tbb40_20120201oss_src.tgz (TBB 4.0 update 3) @Ubuntu 11.10で確認済み。${TBBROOT}/src/index.htmlに記載がある通り、makeオプションに cpp0x=1 を追加指定する*1。 …

static変数初期化とスレッドセーフ

yamasaさんのDCL解説記事で知った、「C++11規格においてブロックスコープなstatic変数の初期化処理はマルチスレッドセーフ」に関するメモ。該当箇所をN3337 6.7/p4より一部引用。(下線部は強調) Otherwise such a variable is initialized the first time …

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

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

(翻訳)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", "…

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>…

asyncについて(実践編)

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

futureとpromiseのあれこれ(実践編)

C++11標準ライブラリのstd::future<T>,std::promise<T>を実際に利用するときの注意点メモ。gcc系共通の注意点として、g++オプションに「-std=c++0x -pthread」を指定する必要がある。前者はC++11機能サポートを有効に、後者はスレッド関連機能を有効にするオプショ</t></t>…

gcc 4.6.2@MacではC++11標準スレッドを利用不可

Mac OS Xのgcc 4.6.2では、C++標準ライブラリのうちスレッド関連機能を利用できない。同環境下ではマクロ_GLIBCXX_HAS_GTHREADSが定義されないため、下記の標準ヘッダが提供する機能を利用できない。MacOS XのPThreadがタイムアウト付き待機関数を正しく実装…