.cppファイルは書くべきではないのかもしれない

C++について考えるのは暇潰しによいと思う。C++は何かを間違った場合の理想形であり、間違った理想を妄想するには非常に良いネタなのである。


で、それはいいとして、ぼーっと考えてたら、ふと、.cppファイルは書かないほうがいいんじゃないか、と、そういう説が挙がった。
もちろん、これは、.ccにしろとかそういう話ではなく、全部ヘッダに書いてしまえよ。という話だ。


ヘッダファイルに実装を書くデメリットは、

  • コンパイル時間が増える
  • ファイルに依存関係が発生する

という部分だ。


が、しかし、ここで、重要なことを忘れていないだろうか。C++コンパイルに時間がかかる場合というのは、複雑な定義を含むヘッダファイルをインクルードした場合だ。
そんで、複雑な定義を含むヘッダファイルというのは、大体ライブラリ(というかSTLとBoost)なので、あちこちのファイルでインクルードされていることが多い。


これは、つまり、
「依存関係の削減を目指すよりも、コンパイル回数を減らすほうを考えたほうがコンパイル時間の節約になる」
ということだ。

.cppファイルが2つあったとして、それぞれコンパイルに10秒かかります。と。そんで、その内訳は、

  • ヘッダファイル7秒
  • ソースファイル3秒

です。と。
この場合、ふつーは、コンパイル時間は20秒になるだろう。
しかし、こういう場合、ソースファイルはいっこにしてしまうべきなのだ。
そうすれば、コンパイル時間が13秒のソースが一個になって、コンパイルの総時間は20秒→13秒へと削減できる。
(もちろん、ここで、依存関係を注意深く設計すれば、コンパイル時間を10秒にすることは可能である。が、しかし、実際にそれを実現するのはあまり簡単じゃない)


全部をヘッダファイルに書いてしまうというのは、色々な面でメリットが多い。

  • そもそも書くのが楽。二回も同じのを書かないでいい
  • インライン展開が期待できる
  • テンプレートはそもそもヘッダじゃないと書きにくい
  • ヘッダファイルの依存関係とか気にしないでいい(無駄なヘッダをincludeしてないかチェックしないでいい)
  • Makefile変更しなくていい


デメリットは、コンパイル時間が増大することだけ。
しかし、それも、嘘かもしれない。一個にまとめてしまったほうが高速かもしれない。(実際測ってみないとわからないけど)


.cppを書くべきではない。全てをヘッダに書いてしまうのだ。
依存関係を減らすのではなく、ソースファイルの数を減らすようにするべきなのである。