2014-01-01から1年間の記事一覧
2014/01/01〜2014/03/31 パスワードとmemset関数 - yohhoyの日記 文字列型のnull/空文字列判定 - yohhoyの日記 文字列取得バッファとしてのstd::string - yohhoyの日記 (翻訳)C/C++のStrict Aliasingを理解する または - どうして#$@##@^%コンパイラは僕…
長いのでこちら→メモリモデル?なにそれ?おいしいの? - yohhoyの日記(別館)C++ Advent Calendar 2014参加記事。
C++11標準ライブラリまたはBoost.Smart_Pointersライブラリが提供するスマートポインタweak_ptrにて、空(empty)状態と参照先の期限切れを区別する方法。本記事の内容はStack Overflowで見つけた質問と回答に基づく。 // C++11 #include <memory> using namespace std</memory>…
C++メモリモデルにおける フェンス(fence) とハードウェア・メモリバリア命令との対応関係についてメモ。まとめ: atomic_thread_fence=コンパイル時の並び替え禁止+メモリバリア命令発行(実行時の並び替え禁止) atomic_signal_fence=コンパイル時の並…
C++14で導入されるジェネリックラムダ(generic lambda)、可変長引数テンプレート(variadic template parameter)、ellipsis(...)の組み合わせによる文法上の曖昧さについて。gccとClangのバグ。 struct { template<typename...Args> auto operator()(Args&&...) const { } } f1</typename...args>…
プログラミング言語C++の基本型(primary type)区分は14種類存在する。C++標準ライブラリ<type_traits>ヘッダで提供されるメタ関数により判別可能。 カテゴリ メタ関数 void型 is_void std::nullptr_t型 is_null_pointer[C++14以降] 整数型 is_integral 浮動小数点数型 i</type_traits>…
元文書:(PDF)N4215 Towards Implementation and Use of memory_order_consume, P.McKenney/T.Riegel/J.Preshingほか, 2014/10/05訳出メモ: 自分自身の理解のために日本語訳を行ったC++メモリモデル/memory_order_consumeに関する提案文書。§5, 6のみ訳出…
C++11で定義される INVOKE 仮想操作の参照実装。C++1z(C++17)に向けてN4169でC++標準ライブラリ入りを提案中。2016-07-28追記:C++1z(C++17)標準ライブラリへのstd::invoke関数テンプレート追加が採択された。2019-09-14追記:C++2a(C++20)標準ライブラリで…
C++1z(C++17)に向けて提案されている同期プリミティブについてメモ。(PDF)N4195 std::synchronic<T> に基づく。初期提案のため概要のみ。2019-09-12追記:C++2a(C++20)に向けて提案文書 P1135R6 が採択され、atomic変数std::atomic<T>に wait / notify_one / notif</t></t>…
Java8で追加されたjava.util.concurrent.CompletableFutureクラスとキャンセル動作について。 CompletableFuture#cancelメソッドは、実行中の非同期処理に割り込み(interrupt)キャンセルしない。 該当CompletableFutureが未完了の場合、CancellationExceptio…
Java8で追加された java.util.concurrent.CompletableFuture*1 クラスについてメモ。CompletionStage, Futureの両インタフェースを実装するクラス。Executorsフレームワーク(Java5以降)およびFork/Joinフレームワーク(Java7以降)の上で、Futureパターン*2に…
Clang関連ツール clang-modernize についてメモ。C++ソースコードレベルでC++11機能を使うよう自動変換するツール。 http://clang.llvm.org/extra/clang-modernize.html Clang 3.6現在、下記のソースコード変換に対応している。 range-based forループへの変…
Java8で機能拡張されたjava.util.Comparator*1インタフェースについてメモ。コンパレータオブジェクトを生成・合成するstatic/defaultメソッドが追加された。 メソッド 機能 naturalOrder() (自然順序付け)コンパレータを生成 reverseOrder() (自然順序…
条件変数(condition variable)同期プリミティブの利用に関して、不適切な単一スレッド通知notify_oneの使用によるデッドロック(dead lock)発生についてメモ。(条件変数 Step-by-Step入門のおまけ記事) 問題: 1生産者スレッド−1消費者スレッドのとき、mt_s…
条件変数(condition variable)同期プリミティブの利用に関して、不適切な単一スレッド通知notify_oneの使用によるデッドロック(dead lock)発生についてメモ。(条件変数 Step-by-Step入門のおまけ記事)スレッド間の非同期データ送受信機構mt_slot<T>として*1、</t>…
長いのでこちら→条件変数 Step-by-Step入門 - yohhoyの日記(別館) コード:https://gist.github.com/yohhoy/d305a6c5249c55ed89a3
Java 8のjava.util.Comparatorインタフェースは、その宣言からは2つのメソッドを持つようにみえるが関数型インタフェース(functional interface)である。 Comparator#equalsはObject#equalsメソッドのオーバーライドとして扱われ、Comparator#compareメソッ…
Java 8で導入されたStream APIの分類についてメモ。 ストリーム型 java.lang.streamパッケージでは4種類のインタフェースが提供される。いずれもBaseStream<T,S>インタフェースを継承する。 インタフェース 用途 Stream<T> T型ストリーム(ジェネリクス) IntStream </t></t,s>…
プログラミング言語C++の列挙型(enum)と、スコープ解決演算子(scope resolution operator)::に関するメモ。C++11以降では、C++03以前からあるスコープ無し列挙型(unscoped enumeration)に対しても::演算子を適用可能となった。 enum E { A }; E e1 = A; // C…
プログラミング言語C/C++におけるビットフィールド幅上限値の差異についてメモ。C++でも型サイズを超えるビット幅指定は避けるべき。 struct X { int m : 100; // ?? }; C: 指定した型サイズsizeof(int)*CHAR_BITを超えてはならない。 C++: 型サイズを超えた…
Android Developers公式にて公開されているマルチスレッドプログラミング入門記事。主にARMアーキテクチャを対象として、ハードウェア・メモリモデルの理論的説明と、Java/C/C++プログラミングでの実践的な留意点に言及している。(題名に反して、Android固…
プログラミング言語C++のオペランド指定無しthrow式の振る舞いについてメモ。 #include <iostream> void do_rethrow() { // オペランドなしthrow式 throw; } int main() { try { try { throw 42; } catch (...) { // int型の値42を再throwする do_rethrow(); } } catch</iostream>…
Boost.Thread 1.56.0では、従来からあるシステムの論理プロセッサコア数取得関数に加えて、物理プロセッサコア数取得関数が追加された。 #include <boost/thread.hpp> int vnum = boost::thread::hardware_concurrency(); // 論理コア数 int pnum = boost::thread::physical_co</boost/thread.hpp>…
プログラミング言語C++のvolatile変数がスレッド間の同期機構として機能するか否かという論点について、有りそうな質問とその答えについての簡易メモの続きの続き。(自身の思考整理用)ある変数がスレッド間の同期機構として機能するためには、下記3つの性…
プログラミング言語Javaの非検査例外(unchecked exception)とthrows節の関係についてメモ。メソッドthrows節で非検査例外を指定することは可能だが、メソッド呼び出し側でのコンパイル時チェックは行われない。*1 void func() throws NullPointerException {…
プログラミング言語Javaにおけるスレッドセーフなシングルトン遅延初期化イディオム。Double-checked lockingイディオムと異なり*1、厳格なメモリモデルが定義されないJava 1.4以前でも正しく動作する事が保証されている。 public class Foo { private Foo()…
C++標準ライブラリ提供クラスのムーブ代入演算子による自己代入操作について。2019-09-02追記:C++17現在はLWG 2468によって、自己ムーブ代入操作による未定義動作(undefined behavior)は回避される。ただし別途規定のない場合、自己ムーブ代入後は “有効だ…
プログラミング言語C++における特殊メンバ関数(special member functions)のユーザ宣言/コンパイラ暗黙宣言に関するメモ。本記事の内容はACCU 2014でのHoward Hinnant氏プレゼン(PDF) "Everything You Ever Wanted To Know About Move Semantics (and then …
Intel TBB 4.2以降で提供されるIntel Transactional Synchronization Extensions(TSX)拡張命令実装によるミューテックス同期プリミティブ。基本はスピンロック(spin_mutex)として動作し、対応プロセッサの場合はTSX拡張命令が利用される。*1 クラス 機能 spe…
プログラミング言語Javaのジェネリクス(Generics)利用パターンに関するメモ。継承/実装する親クラス/インタフェースのジェネリクス仮型引数に、そのクラス/インタフェース自身を再帰的に渡せる。 → Cf.プログラミング言語C++でのCRTP(Curiously Recurring…