yohhoyの日記

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

C++

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

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

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

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

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>…

新機能は属性 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>…

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

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…

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; // 配列末…

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

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

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

C++

スレッドセーフ・遅延機構付き・上限なし・データキューのC++実装。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指定と外部仕様の関係についてメモ。 関数の契約 C++11標準ライブラリの策定過程において、関数がもつ契約(Contracts)という概念に基づき、下記2つの用語が定義された。 広い契約(Wide Cont…

参照型変数とメモリの関係

プログラミング言語C++の言語仕様では、メモリ空間上に 参照型(reference type) の実体が存在するか否かを規定しない(unspecified)。 スカラ型(scalar type)=算術型/列挙型/ポインタ型やその配列型などのオブジェクト(object)は、メモリ空間上に実体が配…

C++ Synchronized Buffered Ostream

C++2a(C++20)に向けて(PDF)P0053R6が採択され、マルチスレッド環境下でのストリーム出力排他制御をサポートする同期化出力ストリームstd::osyncstreamが追加される。 // C++2a(C++20) #include <syncstream> #include <iostream> void thread1(int value) { // 下記行の処理結果が</iostream></syncstream>…

dataメンバ関数:std::string vs. std::string_view

C++1z(C++17)標準ライブラリ文字列std::stringと文字列ビューstd::string_viewにおいて、dataメンバ関数が返すメモリ領域とヌル終端文字列の関係についてメモ。まとめ: stringに “非const版”dataメンバ関数 が追加され、変更可能なヌル終端文字列を返す。(…

文字列リテラルとヌル終端文字列とで関数オーバーロード

C++

プログラミング言語C++の文字列リテラル/ヌル終端文字列に対して、配列参照型をとる関数テンプレートf(const char(&)[N])とポインタ型をとる関数f(const char*)のオーバーロードは、プログラマの期待通りには振る舞わない。本記事の内容はStack Overflowで…

文字列リテラルからのstd::string_view構築

C++1z(C++17)において文字列リテラルから文字列ビューstd::string_viewへ変換する場合、暗黙の型変換ではなくユーザ定義リテラル""svの明示利用が望ましい。 string_viewクラスはC文字列(const char*)からの非explicit変換コンストラクタを提供する。 string…