yohhoyの日記

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

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

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

2013/01/01〜2013/03/31 文字列を含む構造体のP/Invoke - yohhoyの日記 windows.hのmin/maxマクロ回避策4パターン - yohhoyの日記 C11/C++11/POSIXスレッドAPI比較 - yohhoyの日記 threadの利用と例外安全(その1) - yohhoyの日記 std::vectorのサイズ指定…

乱数生成器のサイズ

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

throw null;(C#編)

C#

プログラミング言語C#の throw 文に関するちょっとしたメモ。下記コードはコンパイルエラーとはならず、実際にはSystem.NullReferenceExceptionオブジェクトが送出される。 throw null; // throw new System.NullReferenceException();と等価 Standard ECMA-…

スレッドセーフという幻想と現実

C++

長いのでこちら→スレッドセーフという幻想と現実 - yohhoyの日記(別館)C++ Advent Calendar 2013参加記事。

throw null;(Java編)

プログラミング言語Javaのthrow文に関するちょっとしたメモ。下記コードはコンパイルエラーとはならず、実際にはjava.lang.NullPointerExceptionオブジェクトが送出される。 throw null; // throw new NullPointerException();と等価 The Java Language Spec…

boost::synchronized_valueクラス

Boost.Thread 1.54.0で実験的に追加された boost::synchronized_value<T> クラステンプレートについてメモ。要約: 型Tに対して、複数スレッド間での暗黙的な排他アクセス インタフェースを提供するラッパクラス。synchronized_value<T>クラスは、boost::mutex*1と</t></t>…

(抄訳)N2176 メモリモデルの理論的根拠[一部]

C++

元文書:N2176 Memory Model Rationales, Why atomics have integrated ordering constraints, Hans-J. Boehm氏, 2007/03/09自分自身の理解のために日本語訳を行ったC++11標準ライブラリatomic操作と順序制約(メモリオーダー; memory order)に関する文書。…

initializer-listによるaggregate初期化の制約緩和

C++

C++14 Draft N3485にてCWG defect #1270が適用され、initializer-listによるaggregate(集成体)の初期化条件が緩和された。 C++11標準ライブラリstd::vector, std::arrayにおいて Uniform initialization と Initializer list を組み合わせた場合に、N3337現…

task_groupコンセプト

C++1y(C++14)に向けた並列プログラミングモデルについてメモ。(PDF)N3711 Task Groups As a Lower Level C++ Library Solution To Fork-Join Parallelismにて、タスク並列処理の基本構成要素となるtask_groupコンセプトが提案されている。なお、同名クラスは…

volatile変数とマルチスレッドとの関係についての押し問答(中編)

C++

プログラミング言語C++のvolatile変数がスレッド間の同期機構として機能するか否かという論点について、有りそうな質問とその答えについての簡易メモ(→id:yohhoy:20121016)の続き。(自身の思考整理用)ある変数がスレッド間の同期機構として機能するため…

C++トランザクショナルメモリ拡張まとめ(N3718)

プログラミング言語C++のトランザクショナルメモリ(TM; Transactional Memory)拡張に関するドラフト仕様v1.1(→id:yohhoy:20120414)からの差分メモ。本記事の内容は、2013年8月付けの(PDF)N3718 Transactional Memory Support for C++に基づく。2020-05-22…

C++11属性と空文

C++11の属性(attribute)は空文に対しても指定可能。Clangではswitch構文caseラベルにてfall-through動作を明示できる。このとき空文(;のみ)に独自拡張のclang::fallthrough属性を指定する。 2020-05-05追記:fallthrough属性はC++17から標準サポートされて…

auto main() -> int

C++

C++11で導入された関数宣言でのauto+戻り値型後置(trailing-return-type)とmain関数の組み合わせについてメモ。(少なくともill-formedとは解釈されないハズ)2014-01-06追記:C++ Standard Core Language Defect Reports, 1003. Acceptable definitions of…

環境依存コード切り替えマクロ

C C++

C/C++プリプロセッサを利用した環境依存コードの切り替え。通常の#ifdef〜#endif方式で切り替えるより見た目が綺麗? unsigned int get_tick_msec() { ENV_windows( return GetTickCount(); ) ENV_linux( struct timespec ts; clock_gettime(CLOCK_MONOTONIC…

tbb::task::allocate_continuationによるループ処理オーバーラップ

Intel TBBタスク tbb::task のallocate_continuationによる継続タスク利用に関するメモ。TBB公式リファレンスにある推奨タスクパターン*1とは異なる例を取り上げるが、必ずしも望ましいユースケースとなっていない可能性がある(と思う)。 直列化されたイテ…

OpenMP 2.0とメモリモデルの闇

OpenMPが提供するロック獲得/解放omp_set_lock/omp_unset_lock関数と、OpenMPメモリモデルおよびflush指示文に関するメモ。一見問題がなさそうな下記コードは、OpenMP 2.0以前の仕様に従って厳密に解釈するとプログラマの期待通り動作する保証がない。この…

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…

OpenMPとC++例外の危険な関係

OpenMP並列化領域内からC++例外を送出する場合、例外を送出したスレッドと同一スレッド上で例外catchを行う必要がある。すなわちOpenMPスレッドをまたぐC++例外伝搬は行われず、またOpenMP並列化領域の中から外へC++例外が送出されてはならない。このルール…

OpenMP 4.0仕様リリース

2013年7月 OpenMP 4.0仕様リリース記事 OpenMP 4.0 Specifications Released より抄訳。OpenMP 4.0 APIの新機能は下記を含みます:アクセラレータのサポート。さまざまな種類の計算デバイスをサポートするため、OpenMP 4.0 API仕様の取り組みにおいては全て…

hashCodeメソッドのお手軽実装

Java 7以降ではユーティリティクラスjava.util.Objectsが追加されており*1、ユーザ定義クラスのhashCodeメソッド実装に利用できるヘルパメソッドjava.util.Objects#hash(Object...)を提供する。 class X { private int m1; private String m2; private Objec…

const, mutableキーワードとスレッド安全性

C++

C++11標準ライブラリにおいて const, mutable キーワードが持つセマンティクスと、自作クラスのスレッド安全性に関するイディオムについてメモ。本記事の内容はC++ and Beyond 2012でのHerb Sutter氏プレゼン "You Don't Know const and mutable" に基づく。…

C++標準ライブラリ乱数生成エンジンの動作

C++

C++11標準ライブラリで追加された乱数生成エンジンでは、同一シード値を与えた場合には、処理系によらず同一の乱数列*1を生成する。ただしstd::default_random_engineは処理系定義(implementation defined)であり、std::random_deviceは非決定的な乱数列を生…

auto宣言では同一型に推論すべし

C++

C++11で導入されたauto型指定子(type-specifier)による宣言において、複数の変数を一括宣言する場合にはそれぞれから同じ型へ推論できないとill-formedとなる。 auto x1 = 3.14, x2 = 42; // NG: 前者はdouble, 後者はint auto y1 = 3.14, y2 = 42.; // OK g…

declvalの戻り値型とvoid

C++11標準ライブラリおよびBoost.Utilityライブラリで提供されるdeclval<T>ンプレートの戻り値型についてメモ。 template<class T> typename add_rvalue_reference<T>::type declval() noexcept; 戻り値型が単純なT&&となっていない理由は、テンプレートパラメータT=void型</t></class></t>…

std::stringの地味な拡張

C++

C++11標準ライブラリが提供する文字列std::basic_stringクラステンプレートでは、新たにpop_back, front, backメンバ関数が追加されている。(C++03以前の標準std::basic_stringでは提供されない。)これらはシーケンスコンテナ(sequence container)の一部で…

Visual Studio 2012でサポート済みのC++14機能

Microsoft Visual Studio 2012(MSVC11)でサポートされているC++14機能についてメモ。本記事の内容はMicrosoft Build 2013 "The Future of C++"スライド資料に基づく。MSVC11では、C++14導入予定の「ラムダ式の戻り値型推論の制限緩和」に対応しているとのこ…

IsBadXxxxPtr系APIは使用禁止

Windows APIが提供するポインタ経由アクセス確認関数IsBadXxxxPtr系*1 は、Windows Vista以降および Windows Server 2008以降では決して利用してはならない。 安全な例外処理 以前のバージョンのWindowsでは、IsBadReadPtr および IsBadWritePtr 関数を使用…

pthread_barrier_tはオプショナル

POSIXスレッド(pthread)のバリア同期プリミティブpthread_barrier_tはAdvanced Realtime Threads追加機能(XSI Option)のため提供されない処理系もある。 2022-08-12追記:IEEE Std 1003.1-2017現在は Base仕様に含まれる ため、全てのPOSIX準拠処理系で提供…

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

gcc

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

「pthreadサポート」の意味するところ

ある処理系が “POSIXスレッド(pthread)標準をサポートする” とき、処理系(実行環境を含む)で担保すべき事項と、利用者(アプリケーションプログラマ)が守るべき制約についてメモ。アプリケーションをプログラマの意図通り実行させるための、処理系/利用…