ぷろみん

プログラミング的な内容を扱ってます

C++

関数ポインタよりもstd::functionを使おう

C++

書きやすさ // 関数ポインタ void (*Func)(void); void (Foo::*Func2)(void); // std::function std::function<void(void)> Func; std::function<void(Foo*)> Func2; これは慣れてないと両方読みづらいかもしれませんね。 慣れるとfunctionの方が型名、変数名といういつものルールに</void(foo*)></void(void)>…

C++の初期化は分かりにくい2

前の C++の初期化は分かりにくい - ぷろみん newしてもゼロクリアされる訳じゃない struct Foo{ int a; }; // デフォルト初期化、aは不定 auto foo1 = new Foo; // 値初期化、aは0 auto foo2 = new Foo(); 省略可能なのでまさかと思ったら、やっぱりnewにも…

C++の初期化は分かりにくい

概要 C++の初期化関係が複雑に感じたのでまとめました。 初期化の種類 まず、以下の3つの初期化が存在するのが分かりにくいです。 // デフォルト初期化 Foo foo; // 値初期化 Foo foo{}; auto foo = Foo(); // ゼロ初期化 // 常に0クリア。不定値を持たない…

生配列よりもstd::arrayを使った方が良い理由

C++

概要 生配列を使う人がstd::arrayを使うきっかけになれば良いなと思います。 パフォーマンス 最適化をかければstd::arrayは生配列と全く同じアセンブリを吐き出す事が知られています。 つまり、パフォーマンスに差はありません。 アルゴリズム アルゴリズム…

forに名前を付けてあげましょう

C++

概要 何故forを使うべきでないかを解説します。 比較 とりあえず、forを使った例と使わなかった例を見てみましょう。 // for int items_count = 0; for(auto item: v){ if(item == 3){ ++items_count; } } // non for int items_count = std::count(v.begin(…

Initを作らないで

C++

モチベーション Initとかの関数作る人多いので、無い方が良いって事を伝えたいです。 Initが駄目な理由 一番の理由は標準機能では無いからです。 Initがあるクラスもあれば、無いクラスもある。InitじゃなくてConstructかもしれないし、Startかもしれないし…

shared_ptrとunique_ptrとweak_ptr

C++

モチベーション スマートポインタの使い方を勘違いしている方が多いので スマートポインタの意味 スマートポインタの一番重要な所はポインタに意味付けする事ができる事にあります。 shared_ptrは共有するポインタである事を示し unique_ptrは自分で開放する…

依存関係を隠さないで

C++

モチベーション 依存関係を隠そうとして依存関係を深くしないように。 どちらが良い設計? Foo::Foo() { texture_ = Singleton::GetInstance()->GetTexture(); } // 依存性無しに構築できる? Foo foo; Foo::Foo(const Texture &texture): texture_(texture) …

namespaceとUtilityクラス(staticメンバ関数)

C++

モチベーション namespaceとUtilityクラスでは同じような機能を提供できる。どちらを使うべきか。 namespace namespace Foo { struct Object {}; void Function(Object) {} } int main() { Foo::Object foo; // ADLにより解決されるので簡易にかける Functio…

メンバ初期化子

C++

モチベーション メンバのコンストラクタ初期化子と宣言初期化子って役割被ってるので、どういう時にどっちを使った方が素敵か考えてみました。 コンストラクタ初期化子 class Foo{ public: Foo() // コンストラクタ初期化子 : a_(0) {} private: int a_; }; …

std::experimental::optional

C++

モチベーション ついにoptionalが標準ライブラリに来て嬉しかったので。 optional C++17にはoptionalが追加されるようです。 optionalを使うと以下のような処理が改善されます。 取得に失敗する関数を書く時どうしますか? #include<iostream> struct Foo { Foo()=defa</iostream>…

Pimplイディオムはアンチパターン

C++

モチベーション ある時、Pimplイディオムはアンチパターンという言葉を聞きました。 良いパターンだと思ってたので何でだろうと考えてみました。 Pimplイディオムの利点 class Foo { public: // 公開部分 private: class Impl; std::unique_ptr<Impl> pimpl_; }; </impl>…

UNUSEDをやめよう

C++

モチベーション C++でのCライクなコード撲滅キャンペーン UNUSED voidでキャストすると使われていない変数のwarningを消す事ができます。 #define UNUSED(x) (void)(x) void Func( int a ) { UNUSED(a); } C++ C++では以下のようにスマートに書けます。 void…

RAIIから考える良いクラス設計

C++

モチベーション 良いクラス設計を考える。 RAII RAII(Resource Acquisition Is Initialization) リソースの確保を初期化時に行う手法。 拡大解釈してInit関数作るから大丈夫って考え方もあるみたいですが、私は否定的です。 可能ならばコンストラクタで全て…

C++のローカルスコープとオブジェクト寿命

C++

モチベーション 一定区間の開始、終了関数やフラグ変数の問題を改善します。 クリティカルセクション 英語wikipedia http://en.wikipedia.org/wiki/Critical_section pthread_mutex_lock( &cs_mutex ); // マルチスレッド処理 pthread_mutex_unlock( &cs_mut…

#ifdefだって置き換えられる

C++

#defineによる定数やマクロの置き換えはconst, constexpr等で可能です。(全部ではないですが) #ifdefの置き換えは可能なのでしょうか? class Calc{ public: void Execute(){ int a = 1; int b = 2; int c = a + b; #ifdef DEBUG std::cout << c; #endif }…

コンパイラファイアウォール

C++

概要 依存関係を減らしコンパイル時間を減らすという考え方です。 手法 インターフェース 前方宣言 PImpl インターフェース インターフェースを継承した様々なクラスを知らずに使えます。 // foo.h struct Foo{ virtual void Func() = 0; virtual ~Foo(){} }…

inline, inlファイル

C++

inlファイル 大体次のどちらかを意味します。 .h拡張子のinlineの実装を記述したファイル .inl拡張子のマイクロソフトが定義したinline実装ファイル 結局どっちもinline実装ファイルです。 inlineの意義 コンパイラの最適化が進んできたので今では大分無意味…

operator delete

C++

operator deleteを何とか上手く活用しようと試行錯誤した時のログです。 struct Foo{ int* a_; Foo(){ a_ = new int; // 例外を投げるかもしれない処理 throw 1; } // デストラクタでは何もしない ~Foo(){} void Release(){ delete a_; } // 定義していない…