yohhoyの日記

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

Hidden Friends

C++

プログラミング言語C++におけるライブラリ設計で「ADL(Argument Dependent Lookup)経由でのみ呼び出し可能な非メンバ関数/演算子オーバーロード 定義」を実現するテクニック。下記説明コードのみではメリットがわかりづらいが、非メンバ関数インターフェイ…

定数式を要求するコンセプト

C++2a(C++20) Conceptを利用した「ある式が定数式であること」を要求する制約式の定義。型パラメータTに対して「T::size()がコンパイル時に評価されること」を要求するコンセプトHasConstantSizeの定義例。requires式中の typename type-name; 構文(type-req…

書式指定子の入れ子

プログラミング言語Pythonの str.format や f-string*1 において、書式指定子部のみ1段階の入れ子が許容される。下記コードではいずれも文字列 Hello!!!!! が得られる。 msg = 'Hello' '{:!<10}'.format(msg) f'{msg:!<10}' f, a, w = '!', '<', 10 '{:{}{}…

オーバロード解決の優先順位制御

C++

プログラミング言語C++における関数テンプレートのオーバーロードにおいて、SFINAEと組み合わせてオーバーロード解決の優先順を制御するテクニック。 選択候補が2個のケース 2つの型T, Uに対して、1) 演算 T / U が定義されていれば同演算子を、2) そうでな…

Customization Point Object

C++2a(C++20)標準ライブラリに導入される Customization Point Object についてメモ。*1まとめ: Customization Point == ユーザ定義型に対して事前定義した動作カスタマイズ可能点。具体的な処理実装ソースコードから呼び出される名前。 Customization Poin…

swap(T, U)とis_swappable_with<T, U>とvector<bool>

C++17標準ライブラリには「型が異なる変数間での値交換(swap)」可能か否かを判定するメタ関数 std::is_(nothrow_)swappable_with<T, U> が存在する。一般的には値交換操作は同一型変数間(swap(T&, T&))で行われるが、プロキシ型(proxy)のような特殊ケースにおいて</t,>…

Goodbye "bit" in C++, (Partially)

C++2a(C++20)言語仕様の定義においては、用語 "bit" の利用はできるだけ回避される(完全に無くなる訳ではない)。これはC++2a言語仕様変更「符号付き整数型==2の補数表現を保証」の影響。提案文書 P1236R1 Alternative Wording for P0907R4 Signed Integers…

Win32 Debug CRT Heap Internals

Windows OS上のMicrosoft Visual C++(MSVC)ランタイムライブラリにおける、デバック動作時のヒープメモリ管理用内部データ構造情報。 Win32 Debug CRT Heap Internals

ラムダキャプチャ中での前置ellipsisと後置ellipsis

プログラミング言語C++において可変長引数テンプレートパラメータパックをラムダ式でキャプチャする際、そのキャプチャ方式によってellipsis(...)の前置/後置が異なることに注意。 template <typename... Ts> void func(Ts... xs) { // C++11以降: 簡易キャプチャ(simple-ca</typename...>…

SecureStringクラスは非推奨

.NET Frameworkで提供される System.Security.SecureStringクラス は、新規コードでは利用しないこと。 .NET CoreからはSecureStringクラスは削除されている。 MonoではSecureStringクラスはデータ保護を行わない(mono-5.18.0.245現在) ImportantWe don't …

オブジェクトのDrop順序

プログラミング言語Rustにおける、オブジェクトデストラクト(Drop)順序についてメモ。[本記事はRust 1.32/Stable準拠] 変数は、その変数宣言順序の逆順。 ただし同一パターン内の変数同士では、順序未規定(unspecifined)。 構造体(struct)、タプル、列挙型…

Andrew’s C/C++ Token Count Dataset 2016

C++ C

プログラミング言語C/C++のトークン(記号・キーワード・識別子名など)出現頻度を調査したデータセット。約1.1万のOSSパッケージ/256万行のソースコードから5032万個のトークンを抽出。 (PDF) Andrew’s C/C++ Token Count Dataset 2016 (ACTCD16) http://w…

C++ Conceptsの短縮構文(P1141R2)

次期C++2a(C++20)標準仕様に向けて採択された、コンセプト(concept)関連の短縮構文についてメモ。C++コンセプト概略ついては id:yohhoy:20170904 を参照のこと。本記事の内容はP1141R2 Yet another approach for constrained declarationsに基づく。要約: a…

関数テンプレート特殊化とADLの小改善

C++2a(C++20)における特殊化された関数テンプレート呼び出しとADL(Argument Dependent Lookup)に関する小さな改善。C++17現在の言語仕様では、タプル要素アクセス関数は std::get<N> のように完全修飾名で呼び出す、もしくはusing std::get;により名前getを現在</n>…

OpenMP 5.0仕様リリース

2018年11月 OpenMP 5.0仕様リリース記事 OpenMP 5.0 Is A Major Leap Forward より抄訳。OpenMP仕様バージョン5.0はOpenMP ARB、主要なコンピュータハードウェア/ソフトウェアベンダのグループ、そしてOpenMPコミュニティのユーザによって共同開発されまし…

新機能は属性 or 構文 or 関数?

プログラミング言語C++標準化プロセスにおける、新機能の対応方針についての考え方。2018年Jacksonville会合におけるEWG(Evolution Working Group)ガイダンス。 構文上はオブジェクト(object)が対象のように見えるとしても、値(value)に関する属性を導入すべ…

クラステンプレートの非テンプレートメンバ関数でSFINAE

クラステンプレートのテンプレートパラメータに基づき、非テンプレートなメンバ関数オーバーロードでSFINAEを実現する方法。 template<typename T, typename U> struct X { // テンプレートパラメータT, Uによるメンバ関数オーバーロード void mf(const T&) { ... } // A) void mf(co</typename>…

プロセス終了コードの有効範囲

プロセス終了コードの有効範囲についてメモ。 POSIX: 0〜255。整数値のうち下位8ビットのみ有効。(例: 値257は終了コード1と解釈される) Windows: 0〜4294967295。32ビット整数値。 POSIX規格(IEEE Std 1003.1-2008, 2016 Ed.)より一部引用。 If the new…

randの既定シード値は1

C

C標準ライブラリ提供の擬似乱数生成関数 rand では、既定のシード値は 1 と定義される。 #include <stdlib.h> int main() { // 暗黙にsrand(1)相当でシード値を設定 int x = rand(); } C11 7.22.2.2/p2より引用(下線部は強調)。 The srand function uses the argumen</stdlib.h>…

アトミック、ときどきロックフリー

C++ C

C/C++標準ライブラリ提供のアトミック変数 atomic<T>, atomic_T では、ロックフリー(lock-free)性判定マクロ ATOMIC_*_LOCK_FREE*1 が3状態 Never/Sometimes/Always を取りうる。C++11策定当時の提案文書N2427によれば、“ロックリーに振る舞う可能性あり”(AT</t>…

hardware_{destructive,constructive}_interference_size

C++17で標準ライブラリ <new> ヘッダに追加された hardware_destructive_interference_size, hardware_constructive_interference_size について。 hardware_destructive_interference_size False-Sharing発生を防ぐために必要となる、最小のメモリアドレス距離。</new>…

C++標準ライブラリへのnodiscard属性

C++標準ライブラリにおける nodiscard 属性の使われ方についてメモ。関数戻り値の誤った破棄を警告する目的でC++17言語仕様に導入された。標準ライブラリではC++2a(C++20)からの利用となる。2018年8月現在、下記関数がnodiscard属性付与対象となっている。 o…

文字列ビューstd::string_view 利用ガイド

C++

C++17標準ライブラリ文字列ビュー std::string_view クラス*1利用上の注意点についてメモ。まとめ: string_viewクラス=文字列に対する読取専用のビュー。 std::stringと同じくヌル終端文字列以外も正しく取り扱える。ヌル文字を途中に含むことができる。 s…

入れ子Optionの平坦化(flatten)

プログラミング言語Rustにおいて Option<Option<T>> から Option<T> へ変換する方法。 // ナイーブな実装 fn flatten<T>(x: Option<Option<T>>) -> Option<T> match x { Some(x) => x, None => None, } } // and_thenコンビネータ fn flatten<T>(x: Option<Option<T>>) -> Option<T> { x.and_then(|x| x) }</t></option<t></t></t></option<t></t></t></option<t>…

C++標準ライブラリのビット処理関数群

C++2a(C++20)標準ライブラリに追加される <bit> ヘッダについてメモ。 // C++2a <bit>ヘッダ namespace std { // sizeof(To) == sizeof(From) template<typename To, typename From> constexpr To bit_cast(const From& from) noexcept; // T = 符号なし整数型 template <class T> constexpr bool ispow2(T x</class></typename></bit></bit>…

名無しの変数

C++

プログラミング言語C++には、言語仕様の定義上“名前のない変数(variable)”が存在する。誰得情報。 try { } catch (std::exception&) { // ★ } C++14 3/p6より引用(下線部は強調)。C++17では6/p6。 A variable is introduced by the declaration of a refer…

Is volatile useful with threads?

volatileキーワードはマルチスレッド処理に役立つ?.com(http://isvolatileusefulwiththreads.com/) C http://c.isvolatileusefulwiththreads.com/ C++ http://cxx.isvolatileusefulwiththreads.com/ Java http://java.isvolatileusefulwiththreads.com/ C…

条件付きexplicit指定子

C++2a(C++20)言語仕様では 条件付きexplicit指定子 が追加され、pairやtupleなどの型Tを値保持するクラステンプレートにおいて、型Tコンストラクタ実装時のexplicit性継承(→id:yohhoy:20150416)が容易になる。 // C++17仕様 template <typename T1, typename T2> struct pair { // no</typename>…

配列有効範囲外を指すポインタ値は存在が許されない

C C++

プログラミング言語C/C++における、配列型とポインタ演算の知られざる*1落とし穴。問題:下記sum_odd関数の実行結果は? int data[5] = { 1, 2, 3, 4, 5 }; // 奇数番目の要素値のみを合計する int sum_odd() { int s = 0; int *endp = data + 5; // 配列末…

Type Juggling

PHP

プログラミング言語PHPにおける奇妙な型変換 "Type Juggling"。文字列と数値の比較(==)には要注意。 PHP公式マニュアルより言語リファレンス該当箇所を引用。 整数値を文字列と比較したり、比較に数値形式の文字が含まれる場合は、文字列が数値に変換され、…