読者です 読者をやめる 読者になる 読者になる

Pebble's Diary

プログラマーの作業メモ

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

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 メモリ破壊系バグのつぶし方

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

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>

C++11のmove()でvectorの所有権を移動すると、元のvectorの要素数は0になる

いまいちC++11のmove()の動作が覚えられないので、動作サンプルを書き溜めて覚えたい。 // 検証環境: OSX 10.10.3 Xcode6.3.2 GNU++11 #include <utility> // move() #include <vector> using namespace std; struct JOB { int reward; }; vector<JOB> get_job(void) { vector<JOB> v_jo</job></job></vector></utility>…

C++11でのcondition_variableを使ったマルチスレッド制御

#include <thread> #include <mutex> #include <queue> #include <unistd.h> // usleep using namespace std; mutex print_mutex; // printf()呼び出し排他用 mutex queue_mutex; // v_queue排他アクセス用 queue<int> v_queue; // データキュー condition_variable ready_cond; // 条件変数 void </int></unistd.h></queue></mutex></thread>…

C++11でのスレッドの生成とmutexによるリソースアクセス排他処理

#include <thread> #include <mutex> using namespace std; mutex m; // printf()呼び出し排他用 void worker( void* p ) { int data = *(int*)p; { // printfはスレッドセーフではないので、2つのスレッドから排他的にアクセスする。 // lock_guardはlock()のようなメソッ</mutex></thread>…

C++ sorted vectorで範囲削除

sorted vectorに対し、lower_boundで指定値以上、以下のデータを削除するC++のサンプルです。 覚えられないのでメモ。 #include <vector> int main(int argc, const char * argv[]) { auto description = [](std::vector<int> v){ for( auto value : v ){ printf( "%d\n",</int></vector>…

C++11

C++11の気になる機能 スライド流し読みして気になったのをpickup. auto型推論 iterator定義のコーディング量が減りそうだけど使うかなあ。 decltype型推論 宣言の仕方覚えるのに時間かかりそう。 ラムダ式 Objective-Cで言うBlocksですが、覚えられるかなあ…