質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

4561閲覧

【C++】クラスのインラインメソッドについて

rutiru_tio2

総合スコア11

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2016/07/08 06:18

###前提、質問
いろんな場面で使えるように汎用のクラスを作っていたのですが、どのくらいまでのメソッドをインラインにしていいのか迷ってしまったので質問させていただきました。
ゲッターとかセッターはいいと思うんですが、計算するけど一文で収まる範囲なら別にインラインでも構わないのかな…とか思ったので。

明確な線引きでなくてもいいので自分ならこのくらいまではインラインにしてるなどの意見をお待ちしております。
下の例は簡単なものなのでもっと複雑になった時のこともわかるとうれしいです。

できるだけcppとhに分ける方がいいのというのはわかりますがインラインなら別にいいのではと思ったり…ファイルが大きくなるのと呼び出し時間の兼ね合いはどうなんでしょうかね
###一例 (三次元ベクトルのクラスの簡略化)一

C++

1class Vec3{ 2private: 3 double x, y, z; 4public: 5 //これは多分大丈夫(ゲッター等) 6 double getX()const{ return x; } 7 double getY()const{ return y; } 8 double getZ()const{ return z; } 9 10 //この辺から怪しい(長さを求める等) 11 double getLenghSquare()const{ return x*x + y*y + z*z; } 12 double getLength()const{ return sqrt(getLengthSquare());} 13 14 //これは…どうなんでしょう?(内積と外積を求める) 15 double dot(const Vec3 &obj)const{ return x*obj.getX() + y*obj.getY() + z*obj.getZ(); } 16 Vec3 cross(const Vec3 &obj)const{ return Vec3(y*obj.getZ() - z*obj.getY(), z*obj.getX() - x*obj.getZ(), x*obj.getY() - y*obj.getX());}

###補足情報
これで作ったクラスをできればライブラリ化してまとめたいと思ってるのでそのあたりも含めて教えてくださると助かります

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

ここでいうインラインとは、ヘッダーに実装を書くという意味でのインラインですよね。

できるだけcppとhに分ける方がいいのというのはわかりますがインラインなら別にいいのではと思ったり…

そうする必要があるなら分ければ良いし、必要がなければ分けなくても良いです。
私の場合は、依存関係とか、コードの隠蔽とか、何か理由がない限りは気軽にヘッダーに実装を書いています。

そもそもテンプレートでは必然的にヘッダーに実装を書くことになりますから、テンプレートは良いけどそうでないなら実装を分ける、というのではバランスが悪いですから。

ファイルが大きくなるのと呼び出し時間の兼ね合いはどうなんでしょうかね

あまり気にする必要はないと思います。今時のコンパイラーは自分の都合でインライン展開するかどうかを決めているので、最早明確な線引きはできないと思います。inlineと書いてもインスタンスを作ってコールすることもあれば、inlineと書かなくてもインライン展開することもありますから。気になるなら、速度重視かサイズ重視かインライン展開をどうするかなどをコンパイルオプションで指定することになります。

これで作ったクラスをできればライブラリ化してまとめたいと思ってるのでそのあたりも含めて教えてくださると助かります

ライブラリーの配布形態として、ヘッダーをインクルードすればオッケー、ということなら、利用する側としては簡単で便利ですし、配布の際の手間もかからないと思います。

一方実装を分けてコンパイル済みのライブラリーを配布するなら、スタティックリンクにするのかDLLにするのか、スタティックリンクにするならコンパイルオプションはどうするか、コンパイラーがバージョンアップしたら、など、いろいろ考える必要があります。

ただ、依存ライブラリーとの兼ね合いによっては、どうしてもコードを隠蔽(cppに分ける)した方が都合が良い場合もあります。例えば、別ライブラリーの機能を使う場合、ヘッダーに実装を書いてしまうと、利用者が直接使わないとしてもそのライブラリーのヘッダーにパスを通す必要が出てきます。

投稿2016/07/08 07:49

catsforepaw

総合スコア5938

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

こんにちは。

私も1~2行程度の関数はあまり悩まずinlineにしてます。
コンパイルに時間がかかりそうなものはcppへ持って行った方がよいので、多少複雑な処理をする時はなるべくcpp側で実装してます。

ゲッター/セッターはinlineですね。
「長さを求める」や「内積と外積を求める」程度のものも、inlineならほぼ同じ宣言を2つ書いて2つメンテしなくてよいので、デバッグが終わるまではinlineでかけるものはinlineで書いておいて、ある程度安定してきてからcppへ移動することもあります。そして、これくらいの長さだと移動し忘れることも少なくないです。
どちらにも書ける場合、ヘッダに書く最大のデメリットはコンパイル時間短縮と思います。
逆に最大のメリットはほぼ同じことを2回かかなくて良いことと思います。どちらを取るか悩ましいです。

ライブラリの場合はコンパイル時間の影響は大きい(多くの人が使うものであればあるほど)ので、ゲッター/セッターほど短いもの以外は、なるべくcppへ持って行った方がライブラリのユーザに多少なりと喜ばれそうな気はします。

投稿2016/07/08 06:52

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問