yohhoyの日記

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

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

shared_ptr参照カウントとデータ競合

C++1z(C++17)標準ライブラリでは、スマートポインタstd::shared_ptr<T>のuniqueメンバ関数は非推奨(deprecated)とされる*1。上位互換となるuse_countメンバ関数は残存するが、スレッド間同期には関与しないという要件が明確化され、マルチスレッド実行ではその</t>…

スーパークラスのprivateフィールドにアクセス

プログラミング言語Javaでは、スーパークラスのprivateフィールドはサブクラスへ継承(inherited by)されず、原則としてスーパークラス外部からはアクセスできない。ただし特定の条件下において、サブクラスからスーパクラスprivateフィールドへのアクセスが…

モニタ同期・待機処理と再帰ロックサポート

プログラミング言語Javaが提供するモニタ同期(synchronized構文)および待機処理(Object#wait)は、再帰ロックのセマンティクスをサポートする。*1メモ:待機処理でも再帰ロックをサポートする仕様は珍しい?C++標準ライブラリ(→id:yohhoy:20120802)やPO…

<--(中略)-- 演算子

C++

プログラミング言語C++のヘンテコな演算子。💘(U+1F498) #include <iostream> int main() { int n = 100; while ( 0 <-------------------- n) { // !? std::cout << n << ' '; } } 実行結果: 90 80 70 60 50 40 30 20 10 タネ明かし 前掲C++ソースコードの振る舞いを括</iostream>…

range-based forと文字走査

C++11で導入された range-based for 構文を用いて、文字列を一文字づつ走査する方法。*1 文字列リテラル 文字列リテラルはconst char配列型(→id:yohhoy:20150213)であるため、range-based for 構文による要素走査が可能。ただし文字列リテラル末尾に自動追…

Lockインタフェースとtry-with-resourcesの相性

Java 7で導入されたtry-with-resources構文とLockインタフェースの関係について。Java標準ライブラリのロック処理ではAutoCloseableインタフェースを利用しないため、try-with-resources構文を利用した「変数スコープにもとづくロック獲得・解放処理(Scoped…

initializer_listとMove-only型

C++

C++11で導入されたリスト初期化(list initialization)構文で用いられるstd::initializer_list<E>では、要素型Eにコピー操作を要求するため*1、std::unique_ptrなどのコピー不可/ムーブのみ可能な(Move-only)型を扱えない。この制限により Move-only 型の標準コ</e>…

なぜmutexオブジェクトはムーブできないか?

C++

C++標準ライブラリが提供するstd::mutexほか同期プリミティブ型*1は、意図的にコピー/ムーブ操作を禁止している。本記事の内容はStack Overflowで見つけた質問と回答に基づく。 #include <mutex> class X { int data_ = 0; std::mutex mtx_; using Lock = std::loc</mutex>…

int a = { 42, };

C++

プログラミング言語C++でのスカラ変数の初期化/代入において、Uniform initializationと冗長な末尾カンマ(,)を組み合せた例。構文上は許容されるが、分かりにくい書き方は避けるべき。 int a = { 42, }; // OK: 値42で初期化 int b = { 42 }; // OK: (同上)…

C++/CLIとC++/CXの差分リスト

Microsoft社による独自拡張言語 C++/CLI*1 と C++/CX*2 の差分について。主に言語機能の観点での差分リスト。MSDNフォーラムでのDeon Brewis氏*3回答による。引用中の/clrは C++/CLI に、/ZWは C++/CX に対応する(いずれもVisual C++のコンパイラオプション…

strncpy関数仕様のナゾ

C

C標準ライブラリが提供するstrncpy関数の仕様について。有限長バッファへ文字列を切り詰めてコピーする処理では、strncpy関数が用いられるケースが多い。strncpy関数の仕様として「コピー元srcの文字列長が指定長BUFSIZE以上のとき、コピー先dest末尾にはNUL…

to be, or not to be?

Rust標準ライブラリのコメントより。整数型*1に対してBig Endianへの変換メソッドto_beが提供される。その他にもEndianness変換メソッドto_le, from_be, from_leが提供される。 pub fn to_be(self) -> Self { // or not to be? if cfg!(target_endian = "big…

-Wpessimizing-moveオプション と -Wredundant-moveオプション

LLVM/Clangでは、戻り値最適化(RVO; return value optimization)を阻害する/単に冗長なstd::move関数利用を警告するオプションが提供される。Clang 3.7で追加された警告オプション。両オプションとも -Wall オプション指定に含まれるため、個別に指定するケ…

wheelパッケージの対応アーキテクチャ確認

Python実行環境がサポートするwheelバイナリパッケージのアーキテクチャを確認する方法。 import pip print(pip.pep425tags.get_supported()) # [('cp34', 'none', 'win_amd64'), ('cp34', 'none', 'any'), ...] バイナリパッケージ(拡張子whl)のインスト…

return文と暗黙のムーブと型変換

プログラミング言語C++において、関数からの return 文と暗黙のムーブと型変換の関係についてメモ。*1下記コードfunc_implicit_move関数のように return 文にて型変換(unique_ptr→shared_ptr)を伴う場合、C++11/14言語仕様によって振る舞いが異なる。この…

お手軽__repr__メソッド実装

Pythonのユーザ定義クラスにおいて、__repr__メソッドを手軽に実装する方法。データ属性を名前順にダンプさせるためpprintモジュールを利用する。 import pprint class Node(object): def __init__(self, data, next = None): self.data = data self.next = …

生文字リテラル中の改行コード

C++

C++11で導入された生文字列リテラル(raw string literal)に含まれる改行は、ソースコードファイルの改行コードによらず'\n'(LF)として扱われる。 std::string s = R"(abc xyz)"; assert(s == "abc\nxyz"); C++11 2.14.5/p4より引用。 [Note: A source-file n…

From/Intoトレイトと反射律

Rust標準ライブラリが提供する std::convert::From トレイトは、任意の型に対して反射律(reflexive law)を満たす。Fromトレイトにより実装される std::convert::Into トレイトもまた反射律を満たす。[本記事はRust 1.12/Stable準拠] struct T; let v1: T =…

型推論と無限型(infinite type)

Java言語のジェネリクス(generics)では、型推論過程において無限型(infinite type)が推論されうる。ただしJava言語では無限型を表現できないため、非境界ワイルドカード(unbounded wildcard) を用いた再帰型(recursive type)で代替される。下記コードの条件…

複数例外catchの型推論

Java7で導入された複数例外 catch における型推論についてメモ。*1下記コードでの multi-catch 節における変数eの静的型は、Javaコンパイラの型推論によりException & CustomException型となる。つまりExceptionクラスとCustomExceptionインタフェースの両者…

Option型とNull Pointer Optimization

Rust標準ライブラリが提供するヌル許容型 std::option::Option<T> の空間オーバーヘッドについてメモ。[本記事はRust 1.11/Stable準拠]まとめ: T型がポインタ的に振る舞う(有効値が非ゼロと保障できる)場合、ヌルポインタ最適化(null pointer optimization</t>…

forループとイテレータ

Rust言語のfor構文と IntoIteratorトレイト に関するメモ。[本記事はRust 1.11/Stable準拠] for x in expression { // ループ本体 } Rust公式ドキュメントによれば、forループでは下記コードと等価な処理が行われる。式 expression に対して IntoIterator:…

多値返却×型推論 in C++ (2)

C++1z(C++17)で導入予定の Structured Bindings と クラステンプレートの型推論 を組み合わせて、多値返却関数からの戻り値を型推論された個別変数にて受け取る方法。こちらは多値返却関数fooの戻り値を型推論する前提。 // C++1z(C++17) #include <cassert> #include <string></string></cassert>…

多値返却×型推論 in C++ (1)

C++1z(C++17)で導入予定の Structured Bindings*1 とstd::tupleコンストラクタの改善(→id:yohhoy:20150416)を組み合わせて、多値返却関数からの戻り値を型推論された個別変数にて受け取る方法。 // C++1z(C++17) #include <cassert> #include <string> #include <tuple> #include <type_traits> </type_traits></tuple></string></cassert>…

readdir/readdir_r関数のあれこれ

POSIX環境にて提供されるreaddir, readdir_r関数に関するメモ。まとめ: 事実上スレッドセーフが保証されるreaddir関数を使うこと。将来のPOSIX規格でスレッドセーフ保証が追加予定。 readdir_r関数を利用してはならない。POSIXからも廃止予定であり、GLIBC …

str型とToStringトレイト

Rust 1.9にてstr型のToStringトレイト特殊化(specialization)が実装され、to_stringメソッドによるstr型からString型への変換処理が効率化された。[本記事はRust 1.11/Stable準拠]Rust 1.8以前はトレイト実装特殊化は存在せず、to_stringメソッドはジェネ…

scanf文字列取得と動的メモリ確保

C標準ライブラリscanf関数の書式指定%sにおいて、取得先の文字列バッファを動的確保する機能拡張。 // POSIX準拠システム char *s = NULL; scanf("%ms", &s); // sはmallocで確保される ... free(s); まとめ: 標準C(ISO C):該当機能は存在しない。メモリ領…

HashMapコレクションの性能改善@Java8

Java8標準ライブラリのjava.util.HashMap<K,V>クラスでは、ハッシュ衝突時のパフォーマンス劣化を避けるために キー型K が Comparable インタフェースを実装することが望ましい。ただし、同インタフェースを実装しなくとも正常に動作する*1。 HashMapのインスタン</k,v>…

空白文字を一括削除

Pythonにおいて、文字列から(タブ・改行等を含む)空白文字群を一括削除する手軽な方法。 s = " a \t b\r\n\tc\t\n" s = ''.join(s.split()) # abc 関連URL python - Remove all whitespace in a string - Stack Overflow

nullの型

Java言語におけるnullリテラルは、言語仕様上は null type をもつ唯一の値として扱われる。null type は名前のない特別な型であるため、Javaプログラム上で null type を直接扱うことはできない。Java Language Specification, Java SE 8 Editionより一部引…