ああ、それは使用されます。私はネットワークパケット処理の分野で働いています。私は、ネットワークパケットを処理する2つの異なる会社に勤務しました。そのため、TCPより上のレベルではなく、イーサネットまたはIPレベルで動作しています。
興味深いことに、両方の会社でCがC ++よりも選択されました。ある企業では、2つの製品のうち1つがLinuxカーネル上に構築され、もう1つの製品はLinuxユーザースペースに構築されました。LinuxカーネルはCでプログラムされているため、カーネル製品は明らかにCを使用しましたが、ユーザー空間製品にもCを使用することを選択しました。どちらの製品も2000年頃から開発されました(2000年より少し前のカーネル製品と2000年より少し後のユーザースペース製品)。
その後私が行った会社では、製品はC ++ではなくCで構築されていました。実際には、1990年代半ばからのプロジェクトの継続ですが、最近のパフォーマンス改善の要求により、本質的にすべてを書き換えることが決定されました。この書き換えのためにC ++を選択するオプションがありましたが、選択しませんでした。
ネットワークパケット処理の分野では、パフォーマンスが非常に重要です。そのため、既存のハッシュテーブルよりも高いパフォーマンスを持つ独自のハッシュテーブルを実装したいと思います。ハッシュテーブルの作成者ではなく、私は使用するハッシュ関数を選択します。おそらくパフォーマンスが必要で、MurMurHash3に行きます。おそらくセキュリティが必要で、SipHashに行きます。メモリアロケータは明らかにカスタムです。実際、使用するすべての重要なデータ構造は、可能な限り最高のパフォーマンスを実現するためにカスタム実装されています。
C ++の使用を妨げるものは何もありませんが、通常は悪い考えです。パケットごとに1つの例外がスローされると、パケット処理速度が許容できないレベルに低下します。したがって、C ++の例外を使用することはできません。遅すぎる。データ構造を構造体として実装し、それらの構造体で動作する関数を実装することにより、すでに一種のオブジェクト指向Cコードを使用しています。C ++では仮想関数を使用できますが、仮想関数呼び出しはどこでも使用するとパフォーマンスが低下します。そのため、仮想関数呼び出しが必要な場合は、明示的で関数ポインタを使用する方が適切です。
C ++は、メモリ割り当てなど、背後で多くのことを行います。一方、Cでは、通常は発生しません。メモリを割り当てる関数を作成できますが、通常、関数のインターフェイスから割り当てが行われていることがわかります。
Cでプログラミングするときにできるマイクロ最適化の種類の例として、Linuxカーネルのcontainer_ofマクロを見てください。もちろん、C ++コードでcontainer_ofを使用できますが、だれがそれを行いますか?つまり、ほとんどのCプログラムでは完全に受け入れられますが、典型的なC ++プログラマは、リンクノードを個別のブロックとして割り当てるリンクリストなど、すぐに別のものを提案します。割り当てられたすべてのメモリブロックはパフォーマンスに悪いため、これは望ましくありません。
おそらく、C ++でメリットがあるのは、C ++がテンプレートメタプログラミングを許可することだけです。つまり、関数パラメーターを保持しながら仮想関数呼び出しを回避し、コンパイラーが関数をインライン化できる場合があります。しかし、テンプレートのメタプログラミングは複雑であり、Cのすべての要件を満たすことができたため、C ++のこの機能の利点はそれほど重要ではありません。
ある会社では、機能の一部が実装されたカスタムコンパイル言語が実際にありました。コンパイラのターゲット言語はどれでしたか?アセンブリ?いいえ、32ビットと64ビットの両方のアーキテクチャをサポートする必要がありました。C ++?きっとあなたは喜びます。明らかに、GCCの計算されたgotoを使用したC でした。そのため、カスタム言語はC(または実際には計算gotoをサポートするCのgccバリアント)にコンパイルされ、Cコンパイラはアセンブリを生成しました。