yohhoyの日記

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

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

書式指定%lsとwchar_t型

C C++

C/C++標準ライブラリprintf/wprintf関数ファミリでワイド文字列(wchar_t型)を出力する場合、書式指定には常に%lsを利用する。マルチバイト文字列(char型)に対しては、常に%sを利用する。出力先ストリームのバイト指向/ワイド指向(→id:yohhoy:20120825…

recursive mutexはいつ使う?

POSIX recursive mutexに関するDavid Butenhof氏*1の見解。2005年のニュースグループcomp.programming.threads投稿より部分引用。*2要約: 原則、recursive mutexを使ってはならない。POSIX recursive mutexは、レガシーコード保護用のグローバルMutexを避け…

criticalコンストラクトへの名前指定

OpenMPのcriticalコンストラクトには、オプションで名前を指定できる。 int acc = 0; #pragma omp parallel for for (int i = 0; i < 10; i++) { #pragma omp critical (acc) acc += func(i); } OpenMPランタイムによる排他制御では、同じ名前を付与したコー…

Detection Idiom

C++1z(C++17)標準ヘッダ<type_traits>に追加されるstd::void_tクラステンプレートを用いたイディオム。クラスメンバの存在検知や、型に対して特定の式が有効なことを検知できる。 // C++1z: 型Tがメンバtypeを持つか? template <class, class = std::void_t<>> struct has_type_member : std::false_ty</class,></type_traits>…

WG21 redirect service

C++

タイトル通り。ISO/IEC JTC1/SC22/WG21サイト各種文書への短縮リンク提供サービス。 Usage: wg21.link/nXXXX wg21.link/pXXXX wg21.link/pXXXXrX Get paper. wg21.link/cwgXXX wg21.link/ewgXXX wg21.link/lwgXXX wg21.link/lewgXXX wg21.link/fsXXX Get iss…

TSV簡易パーサ@iostream

C++

C++標準ライブラリ<iostream>のみで、TSV(Tab-Separated Values)形式入力データを解析する。下記コードでは、入力ストリーム(istringstream)へ独自ロケールをimbueし、std::skipwsマニピュレータ*1動作を微調整することでTSV読み込みを実現している。独自ロケールとし</iostream>…

アトミックなファイル更新

POSIX環境またはWindows環境において、ファイルシステム上でアトミック(atomic; 不可分)なファイル更新を実現する方法。まとめ: POSIX:<stdio.h>標準ヘッダrename関数を利用する。 Windows:windows.hヘッダ ReplaceFile 関数が最有力候補。ただし Undocumented </stdio.h>…

Paamayim Nekudotayim

PHP

プログラミング言語PHPにおける スコープ定義演算子 :: は、別名 Paamayim Nekudotayim とも呼ばれる。ヘブライ語 פעמיים נקודתיים でダブルコロンの意。 スコープ定義演算子 (またの名を Paamayim Nekudotayim)、平たく言うと「ダブルコロン」は、トークン…

文字列リテラル最大長の最低保証

C/C++言語における文字列リテラル(string literal)最大長に対する最低保証について。C言語では文字列長さに関する制約が存在する。*1要約: C90:509文字までは言語仕様にて保証。それ以上は環境限界に従う。 509 = 512バイト − CRLF改行(2) − NUL終端(1) C9…

std::functionの戻り値型に関する小修正

C++1z(C++17)で修正される、std::functionクラステンプレートが扱う関数戻り値型にまつわる小さな問題。 // ラムダはintを返すがfunctionオブジェクトは戻り値型voidを扱う std::function<void()> f = [](){ return 42; }; // C++11/14: 未定義動作(undefined behavi</void()>…

-Wnoexceptオプション

gcc(g++)では、C++関数への noexcept 指定子付け忘れを警告するオプションが提供される。Clangでは未実装。要約: 評価結果がfalseとなる noexcept 式オペランドのみが警告対象。残念ながら非常に限定的。 地味にペナルティを受ける「ムーブコンストラクタ/…

複合リテラルの有効期間

C

C99で追加された複合リテラル(compound literal)の有効期間についてメモ。 ファイルスコープに記述した場合、静的記憶域期間(static storage duration)を持つ。 ブロックスコープに記述した場合、該当スコープ内でのみ有効となる。 C99 6.5.2.5/p3, 6より引…

where節でしか記述できない型制約

Rust言語のジェネリック関数(generic function)では、トレイト(trait)を用いて型パラメータ(parameterized types)の制約(bounds)を表現できる。これには2種類の記述方式が存在するが、where節でのみ表現可能な型制約がある。下記のように、ジェネリック関数…

C関数ポインタにObjective-Cデリゲートを渡す

関数ポインタ型をとるC言語インタフェースのライブラリに、Objective-C言語のデリゲート(Delegate)を指定する方法。ARC(Automatic Reference Counting)環境を想定。 // XxxLibライブラリ C言語/公開インタフェース // コールバック関数ポインタ型 // nValue:…

for文の3機能

Go

プログラミング言語Goの for文 についてメモ。Go言語のfor文では、下記3つの言語機能を実現する。*1 [A]「初期化; 継続条件; 更新」を指定する反復処理[通常のfor構文] [B] 範囲(range)を指定する反復処理[範囲ベースfor構文] [C] 継続条件のみを指定す…

Clang警告オプションとメッセージ一覧

LLVM/Clangコンパイラの警告オプション(-Wxxx)と出力メッセージの対応一覧表。Clangソースコードから機械抽出とのこと。 http://fuckingclangwarnings.com/(2021-04-09現在サイト消滅) https://github.com/NSHipster/clangwarnings.com

019 > 020 ?

JavaScript(ECMAScript)構文定義とレガシーコードとの戦い。本記事の内容はStack Overflowで見つけた質問と回答に基づく。 19 > 20 // false 019 > 020 // true ホストがWebブラウザかつ非Strictモードに限って、019 は有効な10進数リテラルの値19、020 は8…

マクロ呼出しに使える括弧記号

Rust言語のマクロ呼出しには(), [], {}のいずれかを利用できる。[本記事はRust 1.0/Stable準拠] let v1 = vec!(1, 2, 3); let v2 = vec![1, 2, 3]; let v3 = vec!{1, 2, 3}; let v1 = vec!(0; 3); let v2 = vec![0; 3]; let v3 = vec!{0; 3}; println!("He…

ブロック式とセミコロン

Rust言語では{〜}によるブロック構造も式(block expression)として扱う。[本記事はRust 1.0/Stable準拠]ブロック式全体の評価結果は、次の型/値となる。 唯一の部分式、または最終セミコロン;の次に出現する部分式の型/値。 ブロック式内が;で終わってい…

空ストリームに対するallMatch/noneMatchはtrue

Java 8で導入されたStream APIに関して、空のストリームに対するallMatchおよびnoneMatch終端操作は常にtrueを返す。なお、空ストリームに対する anyMatchは常にfalseを返す。 // 整数値は偶数か? IntPredicate isEven = n -> (n % 2 == 0); IntStream.empt…

OpenMP並列forループの中断処理

OpenMPによる並列forループにおいて、該当ループの処理途中で中断する方法について。OpenMPでは並列forループ内からの break は禁止されるため、フラグ変数を用いたループ内処理スキップで代用する。並列リージョンでのフラグ変数アクセスは、全てクリティカ…

printfファミリ書式指定%nの応用例

printf関数ファミリの滅多に使われない書式指定%nを利用したコードの例。本記事の内容はStack Overflowで見つけた質問と回答に基づく。2021-10-11追記:C2x(C23)に向け N2834 にて%nの非推奨化(deprecate)が提案されている。 int n; printf("%s: %nFoo\n", "…

anachronistic old-style base class initializer

gcc(g++)が出力する不思議なエラーメッセージについて。役に立たない昔話。本記事の内容はStack Overflowで見つけた質問と回答に基づく。下記コードはC++言語仕様には違反(ill-formed)しているが、gcc/-fpermissiveオプションでコンパイル可能。 struct B { …

std::begin/endとconstexpr指定

C++

C++14標準ライブラリから配列版のstd::begin/end非メンバ関数がconstexpr指定され、constexpr指定付きのstd::cbegin/cend非メンバ関数が追加された。また、std::initializer_list<E>のconstexpr対応に伴い、同オーバーロードstd::begin/end非メンバ関数もconste</e>…

コンパクトなJSON表現へ変換

PythonでコンパクトなJSON文字列(空白文字を最小限に抑える)に変換する。jq --compact-output コマンド出力相当。 import json data = { "id": 42, "name": "Foo Bar", "list": ["A", "B", "C"]} json.dumps(data, separators=(',', ':')) # 最小表現 json…

定数式中でのconstexpr関数はnoexcept指定相当

2020-08-13追記:C++17で言語仕様が調整され、constexpr関数であってもnoexceptは特別扱いされなくなった。詳細は c++ - `noexcept` behavior of `constexpr` functions - Stack Overflow 参照のこと。定数式(constant expression)中で呼び出すconstexpr関数…

index_tupleイディオム もしくは The Indices Trick

C++

C++においてタプル型に格納された可変個の値を、関数呼び出しの実引数などに展開するイディオム。C++14標準ライブラリでは同イディオムをサポートするstd::index_sequence, std::make_index_sequenceが提供される。 // C++14以降 #include <utility> #include <tuple> templa</tuple></utility>…

Perfect Initializationイディオム

型Tを値保持するクラステンプレートにおいて(pair, tupleなど)、型Tコンストラクタの explicit 性を継承するイディオム。「ある型Uからの暗黙型変換を許可するか否か」という性質を、型Tをラップするクラステンプレートへと引き継ぐ。2018-06-09追記:C++2…

sqrt(dx*dx + dy*dy)とhypot(dx, dy)

C C++

C/C++標準ライブラリで2点間距離 (x1,y1) - (x2,y2) を計算する方法。C99以降またはC++11以降では、sqrt関数の他にhypot関数も利用できる。*1 #include <cmath> // C++98 double dist = std::sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)); // C++11以降 do</cmath>…

ConcurrentHashMap computeIfAbsent再帰呼び出しはNG

Java8で導入された java.util.concurrent.ConcurrentHashMap#computeIfAbsent メソッドでは、computeIfAbsentメソッドから呼出される計算処理中から、再帰処理によって同ConcurrentHashMapオブジェクトのcomputeIfAbsentメソッドを再度呼び出してはならない…