ぷろみん

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

ポインタよりも参照を使おう

C++

あんまり関係の無い所 int& aとint &aのどちらで書くでしょうか? 私はint &aの方で書きます。 // int i; // int *ip; // int *const ipc = &i; // int &ir = i; int i, *ip, *const ipc = &i, &ir = i; // const int ci = 0; // const int *cip; // const i…

push_backよりもemplace_backを使おう

C++

emplace push_backでは無駄なコストが発生してしまいます。 そこで、直接コンストラクトできるemplace_backがC++11から追加されました。 #include<vector> namespace torini{ struct Data{ Data(int, int, int){} }; } int main(){ std::vector<torini::Data> v; // 無駄にコンスト</torini::data></vector>…

mapよりもunordered_mapを使おう

C++

unorderedとは 要するにハッシュです。検索が早くなるので基本的にはunordered_mapを使いましょう。 mapはorderedつまり常にソートされた状態で保持されますが、これが有効に働くことは連想配列的な使い方ではまず無いでしょう。 でもkeyに複雑な値が来る場…

探して見つかった場合と見つからなかった場合の処理

C++

C++14の機能を利用しているのでコンパイラによってはビルドが通らないです。 ありがち 処理の分割がいまいちで、コードを読む時に分かりにくいです。 また、for内で読み込みと書き込みを同時に行っているのは良くない書き方の兆候です。 #include<vector> #include<utility> i</utility></vector>…

C++14の簡単に利用できる便利な機能

ラムダ引数の自動化 int main(){ std::vector<int> v; // ラムダの引数にautoが使える std::for_each(v.begin(), v.end(), [](auto i){ std::cout << i; }); } ラムダ引数が複雑になった場合記述するのは冗長です。 その冗長性が省略できるのは簡単でかつ便利です</int>…

javascript style guide

方針 知識のある人は既にコードレベルの情報は発信しません。 望むのは正しいコードの書き方なので、それを引き続き探します。 前回の方針とは少し方向を変えて集合知に頼ってみます。 wikipedia やはり困ったらwikipedia。 wikipediaは良いのですが、ページ…

javascriptの情報を拾う場所

javascriptをちゃんと学習する気になったのでメモ 方針 最新の規格等に触れているブログ等を主軸に探します。 javascript draft等で検索 文法 ECMAScript Syntax Grammar 6th Edition / Draft ECMAScript Language Specification ECMA-262 6th Edition – DRA…

ninjaのwindows環境ビルド

環境 windows8.1, visual studio community, python2.7 準備 PATHに追加 C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Tools INCLUDEに追加 C:\Program Files (x86)\Microsoft…

関数ポインタよりも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++のオススメ学習順 > スコープ namespace、グローバルスコープ、ローカルスコープ等のスコープとインスタンス寿命に関する記事です。 範囲をオブジェクトで表現するメリットについて C++のローカルスコープとオブジェクト寿命

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の意義 コンパイラの最適化が進んできたので今では大分無意味…

C++のオススメ学習順

まだまだ私も学習途中ですが、自分のtodoも兼ねてです。 基礎的な文法 多くの学習サイトで学べます。なので詳細は省略しますが 学習しなくても良いのでは?と思う物を列挙します。 選択基準としては、C++で推奨されていない、詰まりやすい物です。 結局はい…

operator delete

C++

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