yohhoyの日記

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

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

関数テンプレート特殊化と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 argument </stdlib.h>…

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

C++ C

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

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

C++

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

入れ子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> ヘッダについてメモ。2020-05-11追記:(PDF)P1956R1が採択され*1、関数名が大幅に変更(ispow2→has_single_bit/ceil2→bit_ceil/floor2→bit_floor/log2p1→bit_width)された。"2の冪乗(powers of two)" への言及</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 ref…

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"。文字列と数値の比較(==)には要注意。 2022-02-04追記:本記事で取り上げた型変換はPHP 7.4系までの言語仕様。PHP 8.0.0以降ではいずれもfalse値となる。PHP公式の下方互換性に関するドキュメン…

関数呼び出しのトレース

Pythonスクリプトにおいて、非侵襲的に関数呼び出しと戻り値をトレースする方法。 #!/bin/usr/env python3 import inspect import sys def tracer(frame, event, arg, depth=[0]): f_name = frame.f_code.co_name if f_name == '_ag': # dirty hack for CPyt…

C++コルーチン拡張メモ(N4736)

プログラミング言語C++のコルーチン(Coroutines)拡張に関するメモ。2018年4月現在、C++2a(C++20)標準規格での正式採択に向けた検討が進んでいる。2019-08-09追記:2019年2月会合にてP0912R5が採択され、C++2aへのコルーチン導入が決定している。id:yohhoy:20…

遅延機構付きデータキュー

C++

スレッドセーフ・遅延機構付き・上限なし・データキューのC++実装*1。Java標準ライブラリ java.util.concurrent.DelayQueue に相当。通常のデータキューと異なり、キューへの要素追加時に “有効時刻” を指定する。該当要素はその有効時刻を過ぎるまではキュ…

C++標準ライブラリのタイムゾーン(Time Zone)

C++2a(C++20)標準ライブラリ <chrono> ヘッダに追加される タイムゾーン(Time Zone) サポートについてざっくりメモ。本記事では簡単のため名前空間std::chronoを省略する。カレンダー(Calendar)については C++標準ライブラリのカレンダー(Calendar) 参照。まとめ: </chrono>…

C++標準ライブラリのカレンダー(Calendar)

C++2a(C++20)標準ライブラリ <chrono> ヘッダに追加される カレンダー(Calendar) サポートについてざっくりメモ。本記事では簡単のため名前空間std::chronoを省略する。またタイムゾーン(Time Zone)サポートには言及しない。まとめ: 型安全(Type safety): 年(year)</chrono>…

C++標準ライブラリの時計(Clock)

C++2a(C++20)標準ライブラリ <chrono> ヘッダに追加される 時計(Clock) クラス一覧。いずれもstd::chrono名前空間に属する。 Clock 概要 基点(epoch) うるう秒 system_clock システムクロック[C++11] 1970-01-01 00:00:00 UTC 除外 utc_clock 協定世界時(UTC)クロ</chrono>…

C++ミューテックス・コレクション -みゅーこれ-

C++

長いのでこちら→ C++ミューテックス・コレクション -みゅーこれ- 紹介編 - yohhoyの日記(別館) C++ミューテックス・コレクション -みゅーこれ- 実装編 - yohhoyの日記(別館) コード:https://github.com/yohhoy/yamc

ストリーム入出力と評価順規定の厳格化

C++

プログラミング言語C++における評価順規定の変遷についてメモ。本記事ではストリーム挿入(出力)演算子<<のみを扱うが、ストリーム抽出(入力)演算子>>にも同様に適用される。クイズ:下記プログラムを実行すると何が出力されるか? #include <iostream> int main() { in</iostream>…

関数引数リスト評価順規定の厳格化

C++

プログラミング言語C++における評価順規定の変遷についてメモ。本記事では関数呼び出しにおける実引数リストを扱う。超要約:C++17では、プログラマが期待する振る舞いに近づく(※)よう言語仕様が調整された。[※おそらく期待するほどではない]。こまけぇこ…

広い契約(Wide Contracts)とnoexcept指定

C++

プログラミング言語C++のライブラリ設計における、関数へのnoexcept指定と外部仕様の関係についてメモ。2021-07-07追記:本記事が説明するC++標準ライブラリの設計ガイドラインは、当時の提案者名から "The Lakos Rule" と呼ぶらしい。記事 The Lakos Rule …