最近、テンプレートクラスとインライン関数を多用しているため、ヘッダファイルの肥大化が気になります。
ヘッダが肥大化するとコンパイル時間も大きくなり、更にヘッダファイルの可読性も落ちてしまうと思います。
また、ライブラリ化するときはコードを隠蔽したいのですが、ほとんどがヘッダファイルに実体があるため隠蔽できません。
インライン関数やテンプレートクラス、テンプレート関数は必ずヘッダファイルに書く必要があるのでしょうか。
標準ヘッダファイルでは「*.cc」という実体コードをインクルードしているので、それに習うべきなのでしょうか。
No.2ベストアンサー
- 回答日時:
> インライン関数やテンプレートクラス、
> テンプレート関数は必ずヘッダファイルに書く必要があるのでしょうか。
両方とも、現実的に「使う場所」から実装が見えていないと意味がありませんので、
仮に分離して記述しても結果としてはそうなります。
インライン関数やテンプレートを使いまくれば、隠蔽はできません。
意味があるとすれば、実装をインタフェースから分離するという可読性位でしょうか。
ちなみに、言語的には拡張子を特に意識したりしませんので、
.hでも.hppでも.incでも.implでも.ccでも「includeする」以上隠蔽できないのは一緒です。
また、慣習として.ccは単に「C++のソース」を示すだけです。(.cpp等と同様)
コンパイル時間の低減には、プリコンパイルヘッダ(PCH)が有効です。
VCや昨今のGCC等にはこういった機能があるかと思います。
templateは意味上で不可避なことも多いかもしれませんが、
inlineの多用は逆に性能を落とすケースもありますので、
getter/setter等のシンプルなものに限定するなどして、
「見られて困るような処理」がある大物は素直にソースにかかれてはどうでしょう。
# そういう関数は実際inline展開されていないことも多いでしょうし。
隠蔽したいなら、多少面倒でもpImplイディオムとかproxyとか使って、
実装とインタフェースを綺麗に分離する設計を考えた方が良いのではないかと思います。
詳細な回答、ありがとうございます。
>コンパイル時間の低減には、プリコンパイルヘッダ(PCH)が有効です。
これを使うとコンパイルできないことがしばしばあったのであまり使いたくなかったのですが、エラーの起きないプロジェクトでは使ってていこうと思います。
>inlineの多用は逆に性能を落とすケースもありますので、
このあたりのボーダーがよく分かりません。
3行程度の関数なら大丈夫でしょうか。
>隠蔽したいなら、多少面倒でもpImplイディオムとかproxyとか使って、
こちらは知りませんでした。
コピーコンストラクタや代入演算子の定義とか、かなり面倒になりそうですね。
また、参照を使うようなので、その部分の速度ロスが気になります。
なので、よほど隠蔽したいものを除いてはヘッダに記述するか別ファイルに記述し、インクルードという形をとりたいと思います。
No.3
- 回答日時:
> 隠蔽したいなら、多少面倒でもpImplイディオムとかproxyとか使って、
> 実装とインタフェースを綺麗に分離する設計を考えた方が良いのではないかと思います。
pImpl/proxyで実装を分離したところで、実装部もtemplate使うしかないですよね。
ヘッダから実装を追い出すことにはならんのでは?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# メインプログラムに#include <algorithm>を書いて、 そのメインプログラムが // 3 2023/05/02 11:24
- C言語・C++・C# VisualStudioでC++クラスを追加するとき、ファイルを所定のフォルダ下につくりたい 3 2023/08/24 17:17
- C言語・C++・C# visual studio 2019を使っているのですが、何か間違ったところをクリックしてしまい画像 2 2023/03/06 06:46
- JavaScript カラーミーショップのsectionループ内で、[引数][戻り値]ありの関数的な処理を行いたいです。 1 2022/05/07 19:39
- 筋トレ・加圧トレーニング 筋トレと有酸素 1 2022/07/24 17:22
- 筋トレ・加圧トレーニング 筋肥大は起こるのか 3 2022/07/22 12:32
- Visual Basic(VBA) vbaの計算 if elseと範囲について 6 2022/11/26 01:49
- ガーデニング・家庭菜園 野菜育たない原因 2 2022/07/09 09:22
- 人類学・考古学 人類は言葉を使うようになってから、脳の肥大化が止まったと聞きました。 ということは、言葉や文字がなか 3 2023/02/26 22:26
- ガーデニング・家庭菜園 トマト栽培 窒素過剰か獅子頭になる 1 2023/04/18 17:23
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
interface,extend,implementの...
-
オーバーライドとラッパーの違い
-
「継承されたメソッドの可視性...
-
Javaで下線
-
ゲッターを使わないで変数にア...
-
Java難しすぎ
-
親クラスのメソッドを別のパッ...
-
ASP.NETでの共通コードの書き方...
-
「ラッパークラス」の存在意義...
-
JavaのComparatorを使ったソート
-
変数名の付け方
-
グローバルIPとプライベートIP...
-
範囲外の数値を代入したらエラ...
-
「天声人語」をインターネット...
-
「タイプ初期化子が例外をスロ...
-
配列の重複する値とその個数を...
-
final修飾子を使っているのに、...
-
JSPでのArrayListの表示につい...
-
複数の変数を宣言する時、同時...
-
エクセルVBAで、条件に一致する...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
interface,extend,implementの...
-
(vba)他のアプリケーションの右...
-
抽象クラスをJUNITでテストする...
-
「ラッパークラス」の存在意義...
-
ASP.NETでの共通コードの書き方...
-
JTextFieldの入力制限
-
「継承されたメソッドの可視性...
-
C# 「データが失なわれる可能性...
-
VB DLLプロジェクトについて
-
c++でのヘッダーファイルの循環...
-
【C#】クラスのコンストラクタ...
-
「IOException は対応する try ...
-
ファイルパスが取得出来ない(P...
-
メソッドの引数にクラス名を渡す
-
ゲッターを使わないで変数にア...
-
Javaのインスタンス化の構文の...
-
オーバーライドとラッパーの違い
-
vb.net 自作プロパティの削除に...
-
なぜインタフェースを使うのか?
-
VBがオブジェクト指向言語でな...
おすすめ情報