yohhoyの日記

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

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

value category判別

C++

C++11のvalue category(lvalue/xvalue/prvalue)判別マクロ。本記事の内容はStack Overflowで見つけた質問と回答に基づく。 template<typename T> struct value_category { static constexpr auto value = "prvalue"; }; template<typename T> struct value_category<T&> { static const</t&></typename></typename>…

可変長配列の正式名称

C99で導入された、およびC++14導入予定*1となっている「可変長配列」の言語仕様上の正式名について。2016-04-02追記:2016年3月のWG21会合にてArray Extension TSは取り下げられた。JTC1/SC22/WG21 (PDF)N4586, EWG Motions 2参照。2013-10-19追記:C++14 Dr…

volatile教、あるいはvolatile狂

本文こちら→volatile教、あるいはvolatile狂 - yohhoyの日記(別館)

エルビス演算子(Elvis operator)

プログラミング言語Javaに対して、Project Coinで提案されていた エルビス演算子(Elvis operator)?:についてメモ*1。Groovy 1.5では同演算子が採用されており、GroovyからJavaへのフィードバック提案となっている。二項演算子の一種。左オペランドが非nullな…

C++のフェンス is 何

C++

C++メモリモデルにおける フェンス(fence) とatomic変数/非atomic変数の関係についてメモ。まとめ: C++11標準ライブラリが提供するstd::atomic_thread_fence関数*1は、atomic変数アクセスに対してのみ意味をもつ。通常の非atomic変数には直接的な影響を与…

Immutableクラスとfinalフィールドの関係

プログラミング言語Javaにて Immutable なクラスを実装する場合、同フィールドのfinal修飾が必要な理由についてメモ。Immutable オブジェクトを用いる利点の一つとして、自動的*1に保証されるスレッド安全性(thread-safety)が挙げられる。このような Immutab…

atomic変数間のatomicなコピー

C C++

プログラミング言語C/C++が提供するatomic変数*1とそのコピー操作に関するメモ。2個のatomic変数間における “atomicなコピー操作” は提供されない。通常は “atomic変数からの読込(load)”+“atomic変数への格納(store)” で代用すればよい。ただし、下記コード…

malloc(0)の振る舞い

C

C標準ライブラリ提供の malloc関数 に対して、メモリ確保サイズ 0 指定時の振る舞いは処理系定義(implementation defined)。realloc, calloc, aligned_alloc*1でも同様。 2021-09-09追記:次期C2x(C23)標準ライブラリreallocではメモリ確保サイズ 0 の指定は…

Effective C++11/Concurrency関連の目次草案

C++

Scott Meyers氏によるEffective C++11、並行性(Concurrency)関連の目次草案 The View from Aristeia: Draft TOC for EC++11 Concurrency Chapter より抄訳。 スレッド(thread)ではなく、タスク(task)を作ろう(物理的な"スレッド"ではなく、論理的な"タスク"…

記事"C#メモリモデルの理論と実践"

C#

プログラミング言語C#とメモリモデルに関するMSDNマガジンの記事。C#におけるvolatileキーワードの意味論と、各種アーキテクチャ(x86-x64/Itanium/ARM)への実装マッピングについて言及されている。 日本語訳:http://msdn.microsoft.com/ja-jp/magazine/jj86…

FizzBuzz化ストリーム

C++

本文こちら→FizzBuzz化ストリーム - yohhoyの日記(別館)コード:https://gist.github.com/yohhoy/3370099

文字列取得バッファとしてのstd::string

C++

C++標準ライブラリの文字列型 std::string*1 を、C言語インタフェースへの文字列取得バッファとして使う方法についてメモ。本記事の内容はStack Overflowで見つけた質問と回答に基づく。2016-03-27追記:C++17(C++1z)対応版はこちら→文字列取得バッファとし…

C++ atomic_flag実装のための最低要件

C++

C++11標準ライブラリstd::atomic_flag型について標準規格の要求*1通りロックフリー(lock-free)実装を行うにあたり、対象プロセッサに要求される命令セット・アーキテクチャ(ISA; Instruction Set Architecture)についてメモ。2021-03-09追記:C++20標準ライ…

C++11と6個のドット

C++

C++11の文法上、ドット(.)を6連続で記述できる箇所が存在する。本記事の内容は C++11's six dots by Louis Brandy に基づく。 template <class... T> void f(T......); // !? これは下記コードと等価。C++可変長引数テンプレートのfunction parameter packを表すellipsis</class...>…

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

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

QueryPerformanceCounter今昔

Windows API提供の高分解能パフォーマンス計測QueryPerformanceCounter関数についてメモ。 簡易的に書いておきますと WinXPではQueryPerformance系はCPUクロックを返すので上記の現象が起こる WinVista以上でHPETが有効の時はQueryPerformance系はHPETより時…

synchronizedは実装詳細である

プログラミング言語Javaにおけるsynchronized修飾されたメソッドでは、synchronizedはインタフェース*1(シグネチャ)の一部ではなく、そのメソッドの実装詳細に過ぎない。メソッドの実装に対する言及となるため、抽象メソッド(interfaceまたはclassのabstr…

dataメンバ関数と戻り値ポインタ型のconst性

C++

C++標準ライブラリ提供のシーケンスコンテナ/文字列クラスdataメンバ関数 についてメモ。まとめ: std::basic_string<E>::dataメンバ関数は、常に文字列先頭を指すconst E *を返す。この仕様はC++98/03からC++11まで不変。*1 2016-03-27追記:C++17(C++1z)から</e>…

OpenMPのC++言語統合提案

C++1y(C++14)に向けた並列プログラミングモデルについてメモ。(PDF)N3530 Leveraging OpenMP infrastructure for language level parallelisationにて、OpenMP実装インフラをC++言語機能として統合する提案がなされている。初期提案のため骨子のみ。OpenMPは…

Logical XOR operator Revival

C++ Evolution Working Group(EWG)に「論理XOR演算子^^」なるものが提案(?)されているが… 2023-07-23追記:同提案は2013年会合にて却下(NAD)*1されている。C++ Standard Evolution Active Issues List, #37. Logical xor operatorより一部引用。 (snip) T…

atomic型と整数型のサイズ

C C++

プログラミング言語C/C++が標準で提供するatomic型は、必ずしも対応する整数型と同一サイズとは限らない。(とはいえlock-freeなatomic型であれば、ネイティブ命令でatomic操作が内部実装されるハズなので、整数型と同一サイズ/内部表現になると考えられる…

is_scoped_enumメタ関数

C++11以降で導入されたscoped enumeration*1か否かを判別するメタ関数。本記事の内容はStack Overflowで見つけた質問と回答に基づく。2020-11-14追記:C++2b(C++23)標準ライブラリに向けて提案文書(PDF)P1048R1が採択され、<type_traits>ヘッダにstd::is_scoped_enumメタ</type_traits>…

電子書籍"Threading in C#"

C#

C#/CLRによるマルチスレッドプログラミングの基礎〜Parallel LINQ(PLINQ)に関する電子書籍。HTML形式およびPDF形式(125頁)で無償公開されている。 http://www.albahari.com/threading/, Joseph Albahari

latch, barrier同期プリミティブ

C++1y(C++14)に向けて提案されている同期プリミティブについてメモ。N3600 C++ Latches and Barriers に基づく。2019-09-11追記:C++2a(C++20)に向けて P1135R6 が採択され、C++標準ライブラリにstd::latchとstd::barrierが追加される。https://github.com/y…

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

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

ファイルの同一性判定

POSIX環境またはWindows環境にて、2つのパス文字列が同一ファイルを指すか否かを判定する方法。(ファイルが存在していることが前提) POSIX デバイスIDとinode番号*1を用いて同一性判定を行う。 #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> int is_identical_file(const</unistd.h></sys/stat.h></sys/types.h>…

Duff's device

C

プログラミング言語Cにおいて、たまに「メモリ転送処理の最適化実装」もしくは「swtich文の難解な使い方」として紹介されるアルゴリズムの名前。ループ展開(loop unwinding, loop unrolling)最適化の一種。オリジナルコードでは転送先to=メモリマップドレジ…

std::random_shuffle関数はスレッド安全?

C++

C++標準ライブラリが提供するstd::random_shuffle関数テンプレートのスレッド安全性についてメモ。2014-12-04追記:std::random_shuffle関数テンプレートはC++1z(C++17)にて削除(remove)される。http://isocpp.org/blog/2014/11/updates-to-my-trip-report参…

rand関数とstd::random_shuffle関数テンプレートの関係

C++ C

2014-12-04追記:std::random_shuffle関数テンプレートはC++1z(C++17)にて削除(remove)される。http://isocpp.org/blog/2014/11/updates-to-my-trip-report参照。C++標準ライブラリが提供するstd::random_shuffle関数テンプレート*1では、その内部実装にてC…

\uuuu...の怪

プログラミング言語Javaにおけるソースコード上のUnicodeエスケープでは、バックスラッシュ(\)に続くuをいくつでも記述してよい。 String s0 = "\u65e5\u672c\u8a9e"; // "日本語" String s1 = "\uu65e5\uuu672c\uuuu8a9e"; // s0.equals(s1) == true The Ja…