โอ้ใช่มันถูกใช้ ฉันทำงานในด้านการประมวลผลแพ็คเก็ตเครือข่าย ฉันอยู่ที่ บริษัท ต่าง ๆ สองแห่งที่เราดำเนินการแพ็คเก็ตเครือข่าย ดังนั้นเรากำลังทำงานที่ระดับ Ethernet หรือ IP ไม่ใช่ระดับที่สูงกว่า TCP
ที่น่าสนใจในทั้งสอง บริษัท C นั้นถูกเลือกมากกว่า C ++ ในหนึ่งใน บริษัท นั้นหนึ่งในสองผลิตภัณฑ์ถูกสร้างขึ้นบนเคอร์เนลของ Linux ในขณะที่ผลิตภัณฑ์อื่นนั้นสร้างขึ้นใน Linux userspace ผลิตภัณฑ์เคอร์เนลใช้ C เป็นลินุกซ์เคอร์เนลเป็นโปรแกรมใน C แต่พวกเขาเลือกที่จะใช้ C สำหรับผลิตภัณฑ์ userspace เช่นกัน ผลิตภัณฑ์ทั้งสองได้รับการพัฒนาเริ่มต้นจากประมาณปี 2000 (ผลิตภัณฑ์เคอร์เนลเล็กน้อยก่อน 2000 และผลิตภัณฑ์ userspace เล็กน้อยหลังจากปี 2000)
ใน บริษัท ที่ฉันไปหลังจากนั้นผลิตภัณฑ์ถูกสร้างบน C ไม่ใช่บน C ++ มันเป็นความต่อเนื่องของโครงการตั้งแต่กลางทศวรรษที่ 1990 แม้ว่าจะมีความต้องการการปรับปรุงประสิทธิภาพเมื่อเร็ว ๆ นี้ แต่ก็มีการตัดสินใจว่าทุกอย่างจะต้องถูกเขียนใหม่ เรามีตัวเลือกให้เลือก C ++ เนื่องจากเขียนใหม่นี้ แต่ไม่ได้ทำ
ในด้านการประมวลผลแพ็คเก็ตเครือข่ายประสิทธิภาพนับเป็นจำนวนมาก ดังนั้นฉันต้องการใช้ตารางแฮชของตัวเองที่มีประสิทธิภาพสูงกว่าตารางแฮชที่มีอยู่ ฉันไม่ใช่ผู้สร้างตารางแฮชที่เลือกฟังก์ชันแฮชที่จะใช้ บางทีฉันต้องการประสิทธิภาพการทำงานและไปสำหรับMurMurHash3 บางทีผมอาจจะต้องการการรักษาความปลอดภัยและไปสำหรับSipHash เห็นได้ชัดว่าตัวจัดสรรหน่วยความจำเอง ในความเป็นจริงโครงสร้างข้อมูลที่สำคัญทั้งหมดที่เราใช้นั้นได้รับการปรับแต่งให้มีประสิทธิภาพสูงสุด
ในขณะที่ไม่มีสิ่งใดที่จะป้องกันการใช้ C ++ มันเป็นความคิดที่ไม่ดี ข้อยกเว้นการส่งครั้งเดียวต่อแพ็คเก็ตจะทำให้อัตราการประมวลผลแพ็กเก็ตลดลงจนอยู่ในระดับที่ยอมรับไม่ได้! ดังนั้นเราไม่สามารถใช้ข้อยกเว้นของ C ++ ได้ ทางช้าเกินไป เรากำลังใช้โค้ด C ชนิดเชิงวัตถุโดยการนำโครงสร้างข้อมูลมาใช้เป็นโครงสร้างแล้วนำฟังก์ชันที่ใช้งานกับโครงสร้างเหล่านั้นมาใช้ C ++ จะอนุญาตให้มีฟังก์ชั่นเสมือนจริง แต่จากนั้นการเรียกใช้ฟังก์ชันเสมือนอีกครั้งจะฆ่าประสิทธิภาพหากใช้ทุกที่ ดังนั้นจึงเป็นการดีกว่าที่จะมีความชัดเจนและมีตัวชี้ฟังก์ชั่นหากจำเป็นต้องเรียกใช้ฟังก์ชันเสมือน
C ++ จะทำสิ่งต่าง ๆ มากมายที่อยู่ด้านหลังของคุณ: การจัดสรรหน่วยความจำ ฯลฯ ในทางกลับกันใน C ที่มักจะไม่เกิดขึ้น คุณสามารถเขียนฟังก์ชั่นที่จัดสรรหน่วยความจำได้ แต่โดยปกติจะเห็นได้จากส่วนต่อประสานของฟังก์ชันที่การจัดสรรเกิดขึ้น
ตัวอย่างของประเภทของการปรับให้เหมาะสมแบบไมโครที่คุณสามารถทำได้เมื่อเขียนโปรแกรมใน C ลองดูที่มาโคร container_of ในเคอร์เนลลินุกซ์ แน่นอนคุณสามารถใช้ container_of ในรหัส C ++ แต่ใครจะเป็นคนทำ ฉันหมายความว่ามันเป็นที่ยอมรับโดยทั่วไปในโปรแกรม C ส่วนใหญ่ แต่โปรแกรมเมอร์ C ++ ทั่วไปจะเสนอสิ่งอื่นทันทีเช่นรายการลิงก์ที่จัดสรรโหนดลิงก์เป็นบล็อกแยกต่างหาก เราไม่ต้องการเพราะบล็อกหน่วยความจำที่จัดสรรไว้ไม่ดีสำหรับประสิทธิภาพ
บางทีสิ่งเดียวที่จะเป็นประโยชน์ต่อเราใน C ++ คือ C ++ อนุญาตให้ใช้เทมเพลต metaprogramming ซึ่งหมายความว่าบางครั้งคุณสามารถหลีกเลี่ยงการเรียกฟังก์ชันเสมือนในขณะที่ยังมีพารามิเตอร์ฟังก์ชันและอนุญาตให้คอมไพเลอร์อินไลน์ฟังก์ชัน แต่เทมเพลตการเขียนโปรแกรมแบบแมปมีความซับซ้อนและเรามีการจัดการเพื่อตอบสนองความต้องการทั้งหมดใน C ดังนั้นประโยชน์ของคุณลักษณะนี้ใน C ++ จึงไม่สำคัญนัก
ในหนึ่งใน บริษัท ที่เรามีภาษาที่รวบรวมเองซึ่งเป็นส่วนหนึ่งของคุณสมบัติได้ดำเนินการมาเดาว่าเป็นภาษาเป้าหมายของคอมไพเลอร์หรือไม่ สภา? ไม่เราต้องสนับสนุนสถาปัตยกรรมทั้งแบบ 32 บิตและ 64 บิต c ++? แน่นอนว่าคุณล้อเล่น เห็นได้ชัดว่ามันเป็น C กับการคำนวณข้ามไปของ GCC ดังนั้นภาษาที่กำหนดเองจึงถูกคอมไพล์ไปที่ C (หรือที่จริงแล้วตัวแปร gcc ของ C ที่รองรับการคำนวณ goto) และคอมไพเลอร์ C ก็สร้างแอสเซมบลี