73787


C/C++ は非常に高速に動作する言語であることは既に知られていますが、なぜほかのプログラミング言語に比べて圧倒的に高速に動作するのでしょうか？

マシン語やアセンブリ言語に近い記述ができるからでしょうか？ C/C++ の高速化の秘訣が知りたいです。


CC BY-SA 4.0
2021-02-04T00:18:37.880
73782
2021-02-22T09:26:51.340
43413
question
c++ c
C/C++ はなぜ高速に動作するんですか？


> C/C++ は非常に高速に動作する言語であることは既に知られていますが

ハイパースレッディングやマルチコアが登場する前の、過去の話です。シングルスレッドで動作するのであれば、マシン語に近い記述をすることでアドバンテージがありました。しかしマルチスレッドが前提となっている現代においては、動的に処理を組み換えできる言語が速度で上回ることが往々にしてあります。

更にはGPGPUが登場し、ライブラリに指示を出すだけとなると、呼び出す言語にあまり依存しなくなっている分野もあります。


CC BY-SA 4.0
2021-02-04T00:39:42.290
73784
2021-02-04T00:39:42.290
4236
73782
answer


他言語ってのが「インタプリタ」系言語であるなら、そりゃ「コンパイル」系言語と「実行速度を比べる」のがそもそも間違いというか、かわいそうというか。でも「ソースコードを書く時間」「実行に移せるまでの時間」はインタプリタ系言語のほうが圧倒的に短かかったりしますので、それはその言語に何を期待しているかの違い。

同じコンパイル系言語であっても  
[c](/questions/tagged/c "'c' のタグが付いた質問を表示") / [c++](/questions/tagged/c%2b%2b
"'c++' のタグが付いた質問を表示") は事前コンパイル (Ahead-of-Time)  
[java](/questions/tagged/java "'java' のタグが付いた質問を表示") /
[.netframework](/questions/tagged/.netframework "'.netframework'
のタグが付いた質問を表示") は実行時コンパイル (Just-in-Time) [wikipedia :
JIT](https://ja.wikipedia.org/wiki/%E5%AE%9F%E8%A1%8C%E6%99%82%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%A9)  
という違うものがあります。

AOT では、末端顧客が使っている実行環境のうちの最低ラインを想定しておかないといけないのに対して  
JIT では、実行環境に合わせた高度最適化ができる **場合がある** ので、  
客先での JIT にかかる時間を加味しても後者のほうが実行速度が上、なんてことはままあるようです。

ゲーム機 (PS4 / PS5 / XBOX) などの場合、実行環境が勝手に変わることはまずないので AOT
のほうが高速でしょう。ワンチップマイコンなどでは JIT コンパイラを入れるだけの容量が無いので AOT しか選択肢がないのが普通。


CC BY-SA 4.0
2021-02-04T04:12:18.940
73787
2021-02-04T04:12:18.940
8589
73782
answer


インライン化や自動ベクトル化による最適化でコンパイラが実行速度を速くしている。  
長年稼働している言語なので最適化のナレッジが積み上がっているので速いというところでしょうか。

欠点としては最適化を最初にかけるのでCPUアーキテクチャによって遅くなったり動かなくなったりすることがあります。  
あとコンパイル時間が遅いです。

決して言語として速いわけではないと思います。  
長年の実績でインフラが整っていると考えればいいと思います。

言語の仕様としては遅くなる要素は排除されているくらいですかね。  
メモリの境界チェックとかないし。


CC BY-SA 4.0
2021-02-04T11:46:36.010
73796
2021-02-04T11:46:36.010
43826
73782
answer


### 不要な初期化処理を行わない

単純に書き込み処理の量が減るので高速になります。ただし、最初に何の値が入っているか判らないという事なので、これに気付かずバグを生むことがあります。Releaseビルドで挙動が違うとかは、大体これのせい。

### GCやメモリを保護する機能が無く、自分で適切なメモリ管理をしなければならない

最近のGCのある流行りの言語より手間は増えますが、ヒープにアクセスする頻度、余計なメモリチェックが減るので高速になります。ただし、確保したメモリ範囲外を踏み抜こうが気付かずそのまま動いたりするので、良し悪しです。他言語でも、意識的にヒープ使用を抑えるようなコーディングをすると、この辺りはかなり差が縮まります。

### 細かいコンパイルオプション

動作環境が決まっているのであれば、CPUの種類を指定したり、かなり細かいチューニングをしてより速いコードを吐かせる事が可能です。当然環境依存するコードを吐くので、これも良し悪しです。

パっと思いつくのが、こんなとこです。


CC BY-SA 4.0
2021-02-05T00:26:16.490
73804
2021-02-05T00:42:59.223
2021-02-05T00:42:59.223
41943
41943
73782
answer


任意のコンパイラ言語において、コンパイラの実装成熟度の話とは別に（コンパイラの実装をもって仕様とする場合を除いて）「プログラマがコンパイラにどれだけ意味を伝えることが出来るか」という仕様の具合によって、何を保証すればよいのか、どこまで最適化して良いのかがより詳細になり、俗に言う「言語の速さ」という話につながってきます。プログラマしか知り得ない情報をコンパイラに伝える構文やセマンティクスがある言語ほど、コンパイル時に満たすべき条件が弱くなり（より詳細度の高いものになり）、コンパイラは強い最適化をかけることができ、より早い処理を生成しやすくなります。


CC BY-SA 4.0
2021-02-22T09:26:51.340
74202
2021-02-22T09:26:51.340
37013
73782
answer