Pebble Coding

ソフトウェアエンジニアによるIT技術、数学の備忘録

C++11

clang-format をいい感じにvimで使う

.vimrc設定 Bundle `cjuniet/clang-format.vim' let g:clang_format_style="{BasedOnStyle: Google, IndentWidth: 4, Standard: C++11}" 以上です。依存するvimプラグインもなくいい感じです。 使い方は整形したい範囲を行選択してCTRL-Kを押すだけ。 シンプ…

C++ 例外クラス

クラスのコンストラクタで異常を上位に返したい場合、例外を用いる以外に術はない。 こんな時は、C++例外クラスをthrowするのが良い。 もちろん例外送出時にはリソースを全て開放しておこう。 C++例外クラスで使えそうなものを上げておく。 いずれも任意の文…

C++11 シングルトン

class Hoge { public: static Hoge& shared() { static Hoge instance; return instance; } private: Hoge(); } C++でシングルトンを作りたい場合は上記のようにすればよい。 C++11より前の仕様では、複数のスレッドからHoge::shared()を呼び出したときにsta…

std::thread 練習帳その1

以下のコードはコンパイルに失敗し、Attempt to use a deleted function となる。 #include <thread> void update(int& data) { data += 2; } int main(int argc, const char * argv[]) { int data = 11; std::thread t(update, data); t.join(); printf("%d\n", dat</thread>…

C++のシンボルテーブル

macにはnmというシンボルを見るコマンドがあります。 namespace MyNameSpace {class MyObject { public: MyObject(); };MyObject::MyObject() { printf("aa\n"); }} 上記のコードをダイナミックリンクでコンパイルしたモジュールの出力をみてみます。 $ nm a…

C++11 ムーブセマンティクス

C++11 のムーブセマンティクスがよく分からないので実験してみる。 class Bean { public: Bean() :color(0) ,shape(0) { std::cout << "constructor\n"; } Bean(const Bean& other) : color(other.color) , shape(other.shape) { std::cout << "Bean copy co…

C++アプリケーションの高速化

ボトルネックの計測 まずはどこが遅いか計測しよう。全体の時間の1%の処理を50%高速化しても、0.5%高速化したことにしかならない。 std::chronoを使うのがよいだろう。 シビアなケースでは計測結果をメモリ上に配置しておき、あとでまとめて標準出力やログフ…

C++でstd::mutexの使い方の誤りを検出するThread Safety Analysis

C++でstd::mutexの使い方の誤りを検出するThread Safety Analysisというのがclangにあるそうです。 Thread Safety Analysis — Clang 10 documentationbitcoin coreのソースで使われていて知ったのですが、xcode でも使えました。 導入手順 1. 192行の mutex.…

VisualStudio(C++)でメモリリークを検知する

VisualStudio(C++)でメモリリークを検知する方法です。コンソールアプリの場合はmain関数の先頭に以下を追加してデバッグ実行するだけです。 _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );_CRTDBG_LEAK_CHECK_DF を指定することにより…

C++/ObjC/swift コーディング規約

私が考えるC++/ObjC/swift についてのコーディング規約です。 基本的にコーディング規約はプロジェクトの生産性を最大化するのが目的であり、厳しすぎず、ゆる過ぎないものにするべきです。 以下、箇条書きにしていきます。 守るべき規約 定数は先頭に k の…

C/C++/ObjC メモリ破壊系バグのつぶし方 その2

前回 C/C++/ObjC メモリ破壊系バグのつぶし方 その1 - Pebble Coding の続きです。 落ちる原因はいくつかパターンが決まっていますが、例を上げてみます。 ヒープアロケートしていない領域に書き込む 初期化していないポインタに対して、ヒープアロケートせ…

C++11 unique_ptrとshared_ptr

unique_ptrは所有者が1人以下のポインタとして利用する。 実装にatomic関数は用いられていないためコピーや破棄はスレッドセーフではないが、それによるオーバーヘッドは存在しない。 shared_ptrは所有者が2人以上のポインタとして利用する。 いったん値を設…

C++最適化手法

メモリ使用量が増えてもよいので速度を優先させたい場合の最適化方法を考えます。 計算した値をキャッシュし計算回数を減らす 同じ値の設定処理を何度も行わない 関数の戻り値では、構造体の値を返す代わりに構造体のconst参照を返す クラスの不要な関数を削…

SIMD組み込み関数が多すぎるので一覧にしておく

大量の計算を常に行うような場合、C言語の速度をさらに上げるには、CPUのSIMD命令に置き換えられる組み込み関数を使う方法がある。 ただし、これもvDSPと同じで量が多くまた見やすい一覧がないので作ってみる。 なお、独断と偏見で使いそうもないものは一覧…

C++11 type_traits の原理

std::iteratorのソースを読んでいたところ、C++11のtype_traitsがよく分からないため、勉強中。 備忘録として解説しておく。 C++11で<type_traits>というヘッダがSTLに追加されている。 type_traits - cpprefjp C++日本語リファレンス 型の特性を判定、操作するための機能</type_traits>…

C++11でのautoを使った関数定義

C++11では関数定義をautoを使って書くことができるようになった。 今まで int get_value(void); と書いていたものが、C++11以降はこのようにも書ける auto get_value(void) -> int; int get_value1(void) { return 1; } auto get_value2(void) -> int { retu…

std::shared_ptr利用法

std::shared_ptrの利用法です。Infoインスタンスは内側のスコープ内で生成されて外側のスコープ内で破棄されていることが分かります。 struct Info { Info(){ printf("Info() %p\n", this); } Info(const Info& obj) = delete; Info(Info&& obj) = delete; I…

std::vectorメモリ管理

std::vectorにはreserveというメソッドがあるがどのように動作するのか調べてみた。 struct Info { uint8_t* dex = nullptr; Info(){ dex = new uint8_t; *dex = 7; printf("%p Info() dex %p %d\n", this, dex, *dex); } Info(const Info& obj){ dex = new …

C/C++ 構造体アライメント最適化

C/C++の構造体の要素はある程度の境界位置にアライメントされる。そのため、要素の定義順序によって、構造体全体のサイズが変わったりする。たかが数バイトと侮るなかれ。要素数が多ければ、それだけメモリ領域が小さくなり、CPUキャッシュミスが起きる確率…

atomic::compare_exchange_weak C++11

bool compare_exchange_weak (T& expected, T val, memory_order sync = memory_order_seq_cst) noexcept; compare_exchange_weakの動作仕様がいつまでも覚えられないので、メモ。 覚える必要があるのは第一引数と第二引数と戻り値。 メモリオーダーはとりあ…

std::atomic における memory_order_relaxed の動作(C++11)

memory_order_relaxedの使い方がいまいち分からなかったのだが、やっと理解できたので、それについて書いておく。 memory_order_relaxedの説明を探すと以下が見つかる。 Each memory location has a total modification order Memory operations performed b…

C++11 std::atomicを使いこなすための情報リスト

C++11 std::atomicは難解です。 しかし、パフォーマンスが出ない時に頼りになるツールでもあります。 情報はなかなか少ないので、適宜まとめておきます。 CPUの動作に関する説明 CPU とキャッシュのはなし - graphics.hatenablog.com プログラミング :: 高速…

C++ 小さいサイズの構造体を引数に渡す時は値渡し、参照渡しどちらが高速か?

調べてみました。 こんなサンプルで時間を計測しました。 struct Hoge { float a; float b; }; Hoge hoge1 = { 25, 26 }; Hoge hoge2; // 値渡し void func1(Hoge hoge){ hoge2 = hoge; } // 参照渡し void func2(const Hoge& hoge){ hoge2 = hoge; } 1) flo…

C++11環境におけるatomic操作のパフォーマンス比較

C++11のatomic関数はどのくらいのパフォーマンスを出せるのか調べてみました。 short変数に対してスレッド2つを使い、スレッドAが書き込み、スレッドBが読み込みとします。 環境: Intel Core i5 1.6GHz コア数:2 2次キャッシュ(コアのキャッシュ):256KB 3次…

lower_bound,upper_bound(C++)

lower_boundとupper_bound lower_boundとupper_boundはソート済みSTLコンテナにおいて、それぞれ、指定の値以上の値が最初に現れる位置と、指定の値より大きい値が最初に現れる位置のイテレーターを取得する。図にするとこんな感じ。 コンテナ境界周りの動作…

C/C++/ObjC メモリ破壊系バグのつぶし方 その1

メモリ破壊系バグとは メモリ破壊系バグとは、プログラマーが想定して割り当てたメモリ領域のサイズを超えた部分にデータを書き込んでしまい、 プログラムが意図通り動作しなくなるバグのことです。 このバグは以下の特徴を持っています。 再現性が100%では…

やってはいけないC言語コーディング

10年以上前に書かれたC言語のソースを見ていたら、ダメなコーディングの展覧会のようになっていたので、こういう書き方はしてはいけないという例として書き残しておきます。 1) ファイルの最後に意味のないコメント /**************************************…

swiftをC++11に移植する

なぜか、swiftをC++11に移植しているのですが、思ったより楽でした。 C++11の機能はまだ慣れていないので、メモを残しておきます。 1) クラスメンバの宣言時初期化 class Book { Book() {} float price = 10.0; }; 2) swiftクラスのinitが2つあったとして、…

C++ __PRETTY_FUNCTION__と__FUNCTION__の違いは?

FUNCTIONは関数名のみですが、PRETTY_FUNCTIONはnamespaceや引数、戻り値の型も含みます。 #include <iostream> class MyClass { public: MyClass(){}; int myFunction(int arg1){ printf("%s\n", __func__); printf("%s\n", __FUNCTION__); printf("%s\n", __PRETTY_F</iostream>…

C++11スレッド排他制御関連stdライブラリ VisualStudio対応バージョン

#include <condition_variable> void notify_one()ほか VisualStudio2012 #include <atomic> std::atomic<T>ほか VisualStudio2012 #include <mutex> std::lock_guardほか VisualStudio2012 #include <thread> std::threadほか VisualStudio2012 #include <cstdint> std::int32_tほか VisualStudio2012</cstdint></thread></mutex></t></atomic></condition_variable>