yohhoyの日記

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

gcc

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

プログラミング言語C++の typeid 演算子における、参照型および cv修飾(const, volatile)の扱いについてメモ。typeid演算子オペランドに型名(type-id)を指定する場合、下記ルールが適用されることに注意。 対象が参照型(T&, 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がタイムアウト付き待機関数を正しく実装…