Ah evet, kullanılıyor. Ağ paket işleme alanında çalışıyorum. Ağ paketlerini işlediğimiz iki farklı şirkette bulundum. Bu nedenle, Ethernet veya IP seviyesinde çalışıyoruz, TCP'nin üstünde değil.
İlginç bir şekilde, her iki şirkette de C ++ 'a seçildi. Şirketlerden birinde, iki üründen biri Linux çekirdeğinin üzerine, diğer ürün ise Linux kullanıcı alanında yapıldı. Açıkçası C'yi Linux çekirdeği olarak kullanan çekirdek ürün C'de programlanmış ancak kullanıcı alanı ürünü için de C'yi seçmişlerdir. Her iki ürün de yaklaşık 2000 yılından başlayarak geliştirildi (2000'den biraz önce çekirdek ürünü ve 2000'den biraz sonra da kullanıcı ürünü).
Ondan sonra gittiğim şirkette, ürün C ++ değil C üzerinde üretildi. Aslında, 1990'ların ortasından itibaren bir projenin devamıdır, ancak performans iyileştirme talepleri nedeniyle, esasen her şeyin yeniden yazılacağına karar verilmiştir. Bu yeniden yazma nedeniyle C ++ seçme seçeneğimiz vardı, ancak yapmadı.
Ağ paket işleme alanında, performans çok önemlidir. Bu yüzden, mevcut karma tablolardan daha yüksek performansa sahip kendi karma tabloyu uygulamak istiyorum. Karma tablo yazarı değil, hangi karma fonksiyonun kullanılacağını seçen kişi benim. Belki de performans istiyorum ve MurMurHash3'e gidin . Belki güvenlik istiyorum ve SipHash'a gidiyorum . Bellek ayırıcıları açıkça özeldir. Aslında, kullandığımız tüm önemli veri yapıları mümkün olan en yüksek performans için özel olarak uygulanmıştır.
C ++ kullanımını engelleyecek hiçbir şey olmamakla birlikte, genellikle kötü bir fikirdir. Paket başına atılan tek istisna, paket işlem hızını kabul edilemez seviyelere düşürür! Dolayısıyla C ++ 'nın istisnalarını kullanamıyoruz. Yol çok yavaş. Veri yapılarını yapılar olarak uygulayarak ve sonra bu yapılar üzerinde çalışan işlevleri uygulayarak, zaten nesne yönelimli C kodu kullanıyoruz. C ++ sanal işlevlere sahip olacak, ancak daha sonra her yerde kullanılırsa sanal işlev çağrıları performansı keser. Bu nedenle, sanal işlev çağrıları gerekiyorsa, açık ve işlev göstergeye sahip olmak daha iyidir.
C ++ arkanızda birçok şey yapacak: bellek ayırma, vb. Öte yandan, genellikle C'de olmayanlar. Belleği tahsis eden bir fonksiyon yazabilirsiniz, ancak genellikle tahsisin gerçekleştiği fonksiyonun arayüzünden anlaşılır.
C ile programlama yaparken yapabileceğiniz mikro optimizasyonların bir örneği olarak, Linux çekirdeğindeki container_of makrosuna bir göz atın. Tabii, container_of 'i C ++ kodunda kullanabilirsiniz, fakat bunu kim yaptı? Yani, çoğu C programında tamamen kabul edilebilir, ancak tipik C ++ programcıları hemen bağlantı düğümlerini ayrı bloklar olarak tahsis eden bağlantılı bir liste gibi başka bir şey teklif ederler. Bunu istemiyoruz çünkü tahsis edilen her hafıza bloğu performans açısından kötü.
Belki de C ++ 'da bize fayda sağlayacak tek şey, C ++' ın şablon metaprogramlamasına izin vermesidir, yani hala bir işlev parametresi varken bazen sanal işlev çağrılarını önleyebilirsiniz ve derleyicinin işlevleri satır içi yapmasına izin verir. Ancak şablon metaprogramlaması karmaşıktır ve C'deki tüm gereklilikleri yerine getirmeyi başardık, bu nedenle bu özelliğin C ++ 'daki faydası o kadar kritik değildir.
Şirketlerden birinde, aslında özelliklerin bir kısmının uygulandığı özel bir derlenmiş dilimiz vardı. Sanırım derleyicinin hedef dili hangisiydi? Kurul? Hayır, hem 32 bit hem de 64 bit mimarileri desteklemek zorunda kaldık. C ++? Elbette jest yapıyorsun. Açıkçası, bu GCC'nin hesaplanan goto ile C idi . Böylece, özel dil C'ye (ya da aslında hesaplanan goto'yu destekleyen C'nin gcc varyantına) derlendi ve C derleyicisi derleme üretti.