こんにちは!のりです。
今回は、C++のちょっとした知識を紹介してみたいと思います。C言語やC++言語において、ファイルをインクルードする時、#include <>、#include "" の2通りの記述方法があります。
この2通りの記述の「違い」について説明しているページは結構ありますが、これといった使い分けのメリットを説明しているページはあまりない気がしたのでちょっと書いてみようと思いました。
目次
<>(山括弧)、""(ダブルクォーテーション)の違い。
簡単に説明すると、
< > インクルードパスからファイルを検索する。
" " カレントディレクトリからファイルを検索して、ファイルが見つからなかったらインクルードパスから検索する。
となっています。
インクルードパスというのは、VisualStudioのプロパティなどで設定できるコンパイル時のファイル検索パスのルートディレクトリ一覧のことです。
ライブラリは<>(山括弧)を使った方が良いと言われる。
上記のような違いについて説明しているページは多いですが、実際に使い分けの例としては、std系の標準ライブラリのヘッダファイルや、リンクしているライブラリのヘッダファイルなどは、<> で括った方がいいよ!ということくらいしか書いてないことが多いです。
実際にゲーム会社などでプログラミングをする場合も基本的には、その認識で問題はないと思います。良くわからないけど、ライブラリは<>を使え!と言っている方も多いかもしれませんが、ライブラリのファイルをカレントディレクトリに置くことはないので、「ライブラリは<>を使え!」で合っています。カレントディレクトリの検索をスルーするだけ、ファイル検索時間が短縮されます。
最大のメリットはコンパイル時間短縮!
さて、だいたいの解説ページでは、<>を使用することで「カレントディレクトリの検索時間をカットできる」が、微々たるもので大した効果はない!といっている場合が多いです。
実際その通りです。大した効果はありません。数ファイル程度のプログラムにおいてはですが…。この<>が最大の力を発揮するのは大規模プロジェクトにおいてのコンパイル時間短縮です。おそらく、1000ファイルくらいでも効果が実感できないかもしれません。1万ファイルで少し効果があるかなーくらいで、10万ファイルくらいでおっ!?結構効果ある?みたい感じになるかもしれません。
私の実体験として、分散ビルドによるリビルドで1時間くらいかかるプロジェクトが、ソースをリファクタリングして、< >を使用した方が検索が早くなる箇所、同一フォルダ内のファイルなど、" "を使用してカレントディレクトリから検索した方がインクルードパスからより検索が早くなる箇所を適切に書き換えたところ、40分くらいにビルド時間が短縮されたという経験があります。おそらく10万~100万ファイルくらいのプログラムコードだったと思います。
つまり、大規模なプログラムでなければ使い分けを気にする必要はないってことですね。ゲーム会社でいうところのAAAタイトルみたいなゲームに関わっている方は覚えておいて損はないかと思われます。
あとがき
ということで、< > と " " の違いや使い分けるメリットについてでした。急にプログラミング!って感じのお話でした。まあ、プログラミング的には #include なんてとても基本的なものですが、ちょっと詳しくみてみると意外と奥が深かったりもします。
以上、【C++】#include <>(山括弧) ""(ダブルクォーテーション) を使い分けるメリット。でした。