2021年3月アーカイブ

C++ Programming memo 2021/03/12

● このメモ書きの注意点について
私はC++にそれほど詳しいわけじゃないため、適当なことを書いている可能性があります。
C++14を意識していますが、必ずしも新しい規格を追随できているとは限りません。
Linux, elfを暗黙に前提としているかもしれません。

● 関数ポインタ・std::function<>・ラムダ関数
- 関数ポインタをstd::function<>にすることは可能
- ラムダ関数をstd::function<>にすることは可能
--- (ただしデフォルト引数は引数ありとして扱う)
--- (ただしオーバロードで複数候補からあいまいになるとコンパイルエラー)
- ラムダ関数を関数ポインタにすることは部分的に可能
--- キャプチャするラムダ関数は無理
- std::function<>を関数ポインタにするのは無理
実装を理解すれば納得できるんだけど、慣れてないとわかりづらい。

● C++ヘッダのインクルード地獄
- メンバ関数の引数やメンバ変数がさらにクラスになっていることが多い
- のでクラスのヘッダをincludeするとさらに別のクラスの宣言が書かれたヘッダもincludeせざるを得ない
- これが連なると、すべての*.cppにてすべての*.hをincludeする構造に陥りがち
- 防ぐ方法は2つ
--- 1) pure virtual関数だけの基底クラスを外部に見せて、具体化した実装は*.cppに記載する
--- 2) クラスを実体で扱わずにポインタで扱う
- 特に2)、ナマポがイヤだという理由でstd::shared_ptr<>にするとコンストラクタ・デストラクタが必要になり結局実装が必要になる

- includeが多いと依存関係をgccで*.d経由にしてるような環境でmakeの負荷も馬鹿にならなくなる
 ★ 2021/06/24(Thu)追記:いわゆるPimplイディオム、上記の防ぐ方法の2)の説明が誤っている。たとえ実体やshared_ptr<>であったとしても、クラスのコンストラクタ・デストラクタが外に見えないようにしておけば良い。具体的には、*.hに宣言のみを書き、*.cppに実装を書くようにする。宣言を省略するとデフォルトのものが作られるのでNG。たとえdefaultのもので良かったとしても、*.hに宣言を書き、*.cppに=defaultと実装を書くようにすること。Effective Modern C++の項目22を参照するように。

● テンプレートクラスでシングルトン
- テンプレートはヘッダファイルに閉じて実装することが多い
- ので、テンプレートクラスもヘッダだけに書かれることが多い
- ので、シングルトンなテンプレートクラスもヘッダだけに書いてしまいがち
- すると、includeした*.cppごと(翻訳単位)にシングルトンなテンプレートクラスが実体化される
- それら*.oを1つにリンクしたとき本当にシングルトンになってくれるのかどうか自信がなかった
- という不安に応えてくれる、テンプレートの宣言と実装(具現化)を分けるやり方がある
--- 例えばこれ テンプレート関数の宣言と実装を分離する方法 - Qiita
--- https://qiita.com/MasayaMizuhara/items/37f8c2a5462a4f7f8ea0
- ただ、実際に試す限りはリンク時にうまくやってくれる模様
--- コンパイル最適化が入るため、データの一意性は保証しても、それを呼ぶコードの一意性は保証されない
--- (一意性を確保するためのデータは一つだがそれをチェックするコードやコンストラクタのコードは複数になりうる))
- ToDo: クラスのstatic変数の実体が本当に1つになるのかどうか

● その他
- constメンバ関数はあるが(クラスに属さない)const関数はない
- ラムダ関数使えばstd::bind<>はほぼ出番がない(Effective Modern C++に記載あり)
- auto(型推論)は便利
- C++のクラスは「Cの構造体にthisと関数ポインタをパックしたもの」なんだなぁと強く思い知らされる
- オブジェクト指向に偏重すると危険。凝った設計にすることは可能だが凝った設計が必要な場面は非常に限られる
- 凝ったクラスを作ると副作用が怖くてデフォルトコンストラクタ以外(やoperator=())はすべてdeleteにしてしまいがち
- 右辺値参照?ムーブセマンティクス?なにそれおいしいの?てきとーに作ればコンパイラが最適化してstd::moveしてくれるやろ、知らんけど。
- Effective C++, More Effective C++, Effective Modtern C++を読まずにイキったクラス作らないで、マジやめて
- わかるー > 「C++ マジ闇。。。リスカしょ。。」(出典元:Universal Reference を知るべき複数の理由 - すいバカ日誌)

このアーカイブについて

このページには、2021年3月に書かれたブログ記事が新しい順に公開されています。

前のアーカイブは2021年1月です。

次のアーカイブは2021年6月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

月別 アーカイブ

ウェブページ

Powered by Movable Type 7.9.0