การใช้คอมไพเลอร์ C ++ เป็นเพียงการปฏิบัติที่เกินความจำเป็นหรือไม่


60

ดังนั้นฉันจึงทำงานเกี่ยวกับการออกแบบซอฟต์แวร์โดยใช้ C สำหรับโปรเซสเซอร์บางตัว ชุดเครื่องมือประกอบด้วยความสามารถในการคอมไพล์ C และ C ++ สำหรับสิ่งที่ฉันทำไม่มีการจัดสรรหน่วยความจำแบบไดนามิกในสภาพแวดล้อมนี้และโปรแกรมโดยรวมค่อนข้างง่าย ไม่ต้องพูดถึงว่าอุปกรณ์มีพลังประมวลผลหรือทรัพยากรเกือบไม่ ไม่จำเป็นต้องใช้ C ++ ใด ๆ เลย

ที่ถูกกล่าวว่ามีไม่กี่สถานที่ที่ฉันทำฟังก์ชั่นมากไป (คุณสมบัติของ C ++) ฉันต้องการส่งข้อมูลประเภทต่าง ๆ และไม่รู้สึกอยากใช้printfการจัดรูปแบบสไตล์กับ%sอาร์กิวเมนต์ (หรืออะไรก็ตาม) บางประเภท ฉันเคยเห็นบางคนที่ไม่สามารถเข้าถึงคอมไพเลอร์ C ++ ที่ทำprintfสิ่งนี้ได้ แต่ในกรณีของฉันรองรับ C ++ พร้อมใช้งาน

ตอนนี้ฉันแน่ใจว่าฉันอาจได้รับคำถามว่าทำไมฉันต้องโอเวอร์โหลดฟังก์ชันเพื่อเริ่มต้นด้วย ดังนั้นฉันจะพยายามตอบตอนนี้ ฉันต้องส่งข้อมูลประเภทต่าง ๆ ออกจากพอร์ตอนุกรมดังนั้นฉันจึงมีข้อมูลเกินจำนวนเล็กน้อยที่ส่งประเภทข้อมูลต่อไปนี้:

unsigned char*
const char*
unsigned char
const char

ฉันแค่ไม่อยากมีวิธีการหนึ่งที่จัดการกับสิ่งเหล่านี้ทั้งหมด เมื่อฉันเรียกใช้ฟังก์ชั่นที่ฉันต้องการให้มันส่งออกพอร์ตอนุกรมฉันไม่มีทรัพยากรมากมายดังนั้นฉันจึงไม่ต้องการที่จะทำอะไรเลยนอกจากการส่งสัญญาณของฉัน

มีคนอื่นเห็นโปรแกรมของฉันและถามฉันว่า "ทำไมคุณถึงใช้ไฟล์ CPP" นั่นคือเหตุผลเดียวของฉัน นั่นคือการปฏิบัติที่ไม่ดี?

ปรับปรุง

ฉันต้องการตอบคำถามที่ถาม:

คำตอบที่ตรงตามความต้องการของคุณจะขึ้นอยู่กับ:

  1. ขนาดของไฟล์ที่รันได้จะเพิ่มขึ้นอย่างมากหรือไม่ถ้าคุณใช้ C ++

ณ ตอนนี้ขนาดของไฟล์ปฏิบัติการนั้นใช้หน่วยความจำของโปรแกรม 4.0% (จาก 5248 ไบต์) และ 8.3% ของหน่วยความจำข้อมูล (จาก 342 ไบต์) นั่นคือรวบรวมสำหรับ C ++ ... ฉันไม่รู้ว่ามันจะเป็นอย่างไรสำหรับ C เพราะฉันไม่ได้ใช้คอมไพเลอร์ C ฉันรู้ว่าโปรแกรมนี้จะไม่เติบโตอีกต่อไปดังนั้นสำหรับทรัพยากรที่ จำกัด ฉันจะบอกว่าฉันโอเคที่นั่น ...

  1. ไม่ว่าจะมีผลกระทบด้านลบต่อประสิทธิภาพที่เห็นได้ชัดเจนหรือไม่ถ้าคุณใช้ C ++

ถ้ามีฉันก็ไม่ได้สังเกตอะไรเลย ... แต่อีกครั้งนั่นอาจเป็นสาเหตุที่ฉันถามคำถามนี้เพราะฉันไม่เข้าใจ

  1. ไม่ว่าจะเป็นรหัสอาจถูกนำมาใช้ซ้ำบนแพลตฟอร์มที่แตกต่างกันซึ่งมีเพียงคอมไพเลอร์ C เท่านั้น

ฉันรู้ว่าคำตอบนี้แน่นอนไม่มี จริง ๆ แล้วเรากำลังพิจารณาที่จะย้ายไปยังโปรเซสเซอร์ที่แตกต่างกัน แต่มีเพียงโปรเซสเซอร์ ARM ที่มีประสิทธิภาพมากกว่าเท่านั้น


59
ฉันรู้จักใช้ C ++ สำหรับโปรเจ็กต์ที่ใช้คุณลักษณะ C เท่านั้นเพื่อให้สามารถ//แสดงความคิดเห็นได้ ถ้ามันใช้งานได้ทำไมล่ะ?
จูลส์

76
การปฏิบัติที่ไม่ดีจะ จำกัด ตัวเองไว้ที่ C เมื่อคุณมีคุณสมบัติที่ใช้ไม่ได้
Jerry Coffin

35
เมื่อคุณพูดว่า "ใช้คอมไพเลอร์ C ++" คุณหมายถึง "use C ++" เพียงแค่พูดมัน คุณไม่สามารถคอมไพล์ C ด้วยคอมไพเลอร์ C ++ แต่คุณสามารถสลับจาก C เป็น C ++ ได้อย่างง่ายดายซึ่งเป็นสิ่งที่คุณต้องทำจริง ๆ
user253751

4
"สำหรับสิ่งที่ฉันทำไม่มีการจัดสรรหน่วยความจำแบบไดนามิกในตัวประมวลผลและโปรแกรมโดยรวมค่อนข้างเรียบง่ายไม่ต้องพูดถึงว่าอุปกรณ์แทบจะไม่มีกำลังตัวประมวลผลหรือทรัพยากร แต่อย่างใด ฉันหวังว่าประโยคแรกของสองประโยคเหล่านั้นควรจะเป็นเหตุผลที่ไม่ใช้ C ++ เพราะมันเป็นประโยคที่แย่มากถ้าเป็นเช่นนั้น C ++ นั้นใช้ได้ดีกับระบบฝังตัว
Pharap

21
@Jules ฉันแน่ใจว่าคุณรู้เรื่องนี้และคิดย้อนกลับไปซักพัก แต่ในกรณีที่มีคนอ่านข้อความนี้ไม่ได้: //ความเห็นอยู่ในมาตรฐาน C มาตั้งแต่ C99
Davislor

คำตอบ:


77

ฉันจะไม่ไปไกลถึงเรียกว่า "การปฏิบัติที่ไม่ดี" ต่อ seแต่ฉันไม่เชื่อว่ามันเป็นทางออกที่ถูกต้องสำหรับปัญหาของคุณ หากคุณต้องการฟังก์ชั่นสี่อย่างแยกกันเพื่อทำประเภทข้อมูลทั้งสี่ของคุณทำไมไม่ทำสิ่งที่โปรแกรมเมอร์ C ทำมาตั้งแต่กาลเวลา:

void transmit_uchar_buffer(unsigned char *buffer);
void transmit_char_buffer(char *buffer);
void transmit_uchar(unsigned char c);
void transmit_char(char c);

นั่นคือสิ่งที่คอมไพเลอร์ C ++ กำลังทำอยู่เบื้องหลังและมันก็ไม่ใช่เรื่องใหญ่สำหรับโปรแกรมเมอร์ หลีกเลี่ยงปัญหาทั้งหมดของ "ทำไมคุณถึงเขียนไม่ค่อนข้าง -C กับคอมไพเลอร์ C ++" และหมายความว่าไม่มีใครในโครงการของคุณจะสับสนโดยบิตของ C ++ ที่ "อนุญาต" และบิตที่ไม่ได้


8
ฉันจะบอกว่าทำไมไม่เป็นเพราะประเภทการส่งเป็น (อาจ) รายละเอียดการใช้งานดังนั้นการซ่อนมันและปล่อยให้คอมไพเลอร์จัดการกับการเลือกการใช้งานอาจส่งผลให้รหัสอ่านง่ายขึ้น และถ้าใช้คุณสมบัติ C ++ จะช่วยเพิ่มความสามารถในการอ่านแล้วทำไมไม่ทำอย่างนั้นล่ะ?
จูลส์

29
หนึ่งสามารถ#defineส่ง () โดยใช้ C11_Generic
Deduplicator

16
@Jules เพราะมันทำให้เกิดความสับสนมากเกี่ยวกับคุณลักษณะของ C ++ ที่ได้รับอนุญาตให้ใช้ในโครงการ การเปลี่ยนแปลงที่อาจเกิดขึ้นซึ่งมีวัตถุถูกปฏิเสธหรือไม่ เทมเพลตมีอะไรบ้าง ความคิดเห็นสไตล์ C ++? แน่นอนว่าคุณสามารถหลีกเลี่ยงปัญหานี้ได้ด้วยเอกสารสไตล์การเขียนโค้ด แต่หากสิ่งที่คุณกำลังทำอยู่นั้นเป็นกรณีง่าย ๆ ของฟังก์ชั่นการโหลดมากเกินไปให้เขียน C แทน
Philip Kendall

25
@Phillip "ความคิดเห็นสไตล์ C ++" ได้รับการใช้งาน C มานานกว่าทศวรรษ
David Conrad

12
@Jules: ในขณะที่ประเภทการส่งอาจเป็นรายละเอียดการใช้งานสำหรับซอฟต์แวร์ที่ทำใบเสนอราคาประกันภัยแอปพลิเคชัน OPs ดูเหมือนจะเป็นระบบฝังตัวที่ทำการสื่อสารแบบอนุกรมซึ่งประเภทและข้อมูลมีความสำคัญมาก
whatsisname

55

การใช้คุณสมบัติบางอย่างของ C ++ ในขณะที่ปฏิบัติต่อมันในลักษณะ C นั้นไม่เหมือนกันทุกประการ แต่ก็ไม่เคยได้ยินมาก่อนเช่นกัน ในความเป็นจริงบางคนถึงกับไม่ใช้ฟีเจอร์ใดๆ เลยใน C ++ ยกเว้นการตรวจสอบประเภทที่เข้มงวดและมีประสิทธิภาพมากขึ้น พวกเขาเพียงแค่เขียน C (ระวังที่จะเขียนเฉพาะในจุดตัดทั่วไปของ C ++ และ C) จากนั้นคอมไพล์ด้วยคอมไพเลอร์ C ++ สำหรับการตรวจสอบประเภทและคอมไพเลอร์ C สำหรับการสร้างรหัส (หรือติดกับคอมไพเลอร์ C ++ ตลอดทาง)

ลีนุกซ์เป็นตัวอย่างของโค๊ดเบสที่ผู้คนมักถามว่าตัวระบุเช่นclassรับการเปลี่ยนชื่อklassหรือkclassเพื่อให้สามารถคอมไพล์ Linux ด้วยคอมไพเลอร์ C ++ เห็นได้ชัดว่าได้รับความเห็นของไลนัสของ C ++ , พวกเขามักจะได้รับการยิงลง :-D GCC เป็นตัวอย่างของ codebase ที่ถูกแปลงแรกที่จะเป็น "C ++ - ทำความสะอาด C" และจากนั้นค่อยๆ refactored จะใช้มากกว่า c ++ คุณสมบัติ

ไม่มีอะไรผิดปกติกับสิ่งที่คุณทำ หากคุณหวาดระแวงเกี่ยวกับคุณภาพการสร้างรหัสของคอมไพเลอร์ C ++ ของคุณคุณสามารถใช้คอมไพเลอร์เช่น Comeau C ++ ซึ่งคอมไพล์ไปที่ C เป็นภาษาเป้าหมายแล้วใช้คอมไพเลอร์ C ด้วยวิธีนี้คุณยังสามารถตรวจสอบรหัสเพื่อดูว่าการใช้ C ++ เป็นการฉีดโค้ดที่ไวต่อประสิทธิภาพที่ไม่คาดฝันหรือไม่ นั่นไม่ควรเกิดขึ้นกับการโหลดเกินพิกัดซึ่งเป็นเพียงการสร้างฟังก์ชั่นที่มีชื่อต่างกันโดยอัตโนมัติ - IOW สิ่งที่คุณจะทำใน C อยู่ดี


15

คำตอบที่ตรงตามความต้องการของคุณจะขึ้นอยู่กับ:

  1. ขนาดของไฟล์ที่รันได้จะเพิ่มขึ้นอย่างมากหรือไม่ถ้าคุณใช้ C ++
  2. ไม่ว่าจะมีผลกระทบด้านลบต่อประสิทธิภาพที่เห็นได้ชัดเจนหรือไม่ถ้าคุณใช้ C ++
  3. ไม่ว่าจะเป็นรหัสอาจถูกนำมาใช้ซ้ำบนแพลตฟอร์มที่แตกต่างกันซึ่งมีเพียงคอมไพเลอร์ C เท่านั้น

หากคำตอบของคำถามใด ๆ คือ "ใช่" คุณอาจจะดีกว่าที่จะสร้างฟังก์ชั่นที่ตั้งชื่อแตกต่างกันสำหรับประเภทข้อมูลที่แตกต่างกันและผสานกับ C

หากคำตอบของคำถามทั้งหมดคือ "ไม่" ฉันไม่เห็นเหตุผลที่คุณไม่ควรใช้ C ++


9
ฉันต้องบอกว่าฉันไม่เคยเจอคอมไพเลอร์ C ++ ที่สร้างโค้ดที่แย่กว่า C compiler สำหรับโค้ดที่เขียนในเซตย่อยที่แบ่งใช้ของสองภาษา คอมไพเลอร์ C ++ รับตัวแทนที่ไม่ดีสำหรับทั้งขนาดและประสิทธิภาพ แต่ประสบการณ์ของฉันคือการใช้คุณสมบัติ C ++ ที่ไม่เหมาะสมซึ่งทำให้เกิดปัญหา ... โดยเฉพาะถ้าคุณกังวลเรื่องขนาดอย่าใช้ iostreams และไม่ใช้ แม่แบบ แต่มิฉะนั้นคุณควรจะปรับ
จูลส์

@Jules: สำหรับสิ่งที่คุ้มค่า (ไม่มาก IMO) ฉันได้เห็นสิ่งที่ขายเป็นคอมไพเลอร์เดียวสำหรับ C และ C ++ (Turbo C ++ 1.0 ถ้าหน่วยความจำทำหน้าที่) ให้ผลลัพธ์ที่แตกต่างกันอย่างมากสำหรับอินพุตที่เหมือนกัน ตามที่ฉันเข้าใจแล้วนี่เป็นก่อนที่พวกเขาจะเสร็จสิ้นคอมไพเลอร์ C ++ ของตัวเองดังนั้นแม้ว่ามันจะดูเหมือนคอมไพเลอร์ตัวหนึ่งด้านนอก แต่ก็มีคอมไพเลอร์สองตัวที่แยกจากกันจริงๆ - หนึ่งสำหรับ C อีกอันสำหรับ C ++
Jerry Coffin

1
@JerryCoffin หากหน่วยความจำทำหน้าที่ผลิตภัณฑ์ Turbo ไม่เคยมีชื่อเสียงที่ดี และถ้าเป็นรุ่น 1.0 คุณอาจขอตัวเองได้หากไม่ได้รับการขัดเกลาอย่างสูง ดังนั้นมันอาจไม่ได้เป็นตัวแทนมากนัก
Barmar

10
@Barmar: จริงๆแล้วพวกเขามีชื่อเสียงที่ดีพอสมควร ชื่อเสียงที่ไม่ดีของพวกเขาในตอนนี้ส่วนใหญ่มาจากอายุที่แท้จริง พวกเขากำลังแข่งขันกับผู้รวบรวมคนอื่น ๆ ที่มีเหล้าองุ่นเดียวกัน - แต่ไม่มีใครโพสต์คำถามเกี่ยวกับการทำสิ่งต่าง ๆ ด้วย gcc 1.4 (หรืออะไรก็ตาม) แต่คุณถูกต้อง - มันไม่ได้เป็นตัวแทนมาก
Jerry Coffin

1
@Jules ฉันจะยืนยันว่าแม้แต่แม่แบบก็ดี แม้ว่าทฤษฎีที่ได้รับความนิยมการสร้างอินสแตนซ์ของเท็มเพลตไม่ได้เพิ่มขนาดรหัสโดยปริยายขนาดของโค้ดโดยทั่วไปจะไม่เพิ่มขึ้นจนกว่าจะมีการใช้ฟังก์ชันจากเทมเพลต (ในกรณีนี้การเพิ่มขนาดจะเป็นสัดส่วนกับขนาดของฟังก์ชัน) ประกาศตัวแปรคงที่ กฎของการอินไลน์ยังคงมีผลบังคับใช้ดังนั้นจึงเป็นไปได้ที่จะเขียนเทมเพลตที่ฟังก์ชันทั้งหมดถูกอินไลน์โดยคอมไพเลอร์
Pharap

13

คุณตั้งคำถามว่าการคอมไพล์ด้วย C ++ เพียงให้สิทธิ์การเข้าถึงคุณลักษณะเพิ่มเติมแก่คุณ กรณีนี้ไม่ได้. การคอมไพล์ด้วยคอมไพเลอร์ C ++ หมายความว่าซอร์สโค้ดของคุณถูกตีความว่าเป็นซอร์ส C ++ และ C ++ เป็นภาษาที่แตกต่างจาก C ทั้งสองมีเซ็ตย่อยทั่วไปขนาดใหญ่พอที่จะเขียนโปรแกรมได้อย่างเป็นประโยชน์ แต่แต่ละอันมีคุณสมบัติที่อื่น ๆ ขาด เป็นไปได้ที่จะเขียนโค้ดที่ยอมรับได้ในทั้งสองภาษา แต่ตีความแตกต่างกัน

หากสิ่งที่คุณต้องการอย่างแท้จริงคือการทำงานหนักเกินไปฉันก็ไม่เห็นประเด็นที่ทำให้เกิดความสับสนโดยการนำ C ++ เข้ามา แทนที่จะใช้ฟังก์ชั่นต่าง ๆ ที่มีชื่อเดียวกันให้แยกความแตกต่างของรายการพารามิเตอร์เพียงแค่เขียนฟังก์ชั่นที่มีชื่อต่างกัน

สำหรับเกณฑ์วัตถุประสงค์ของคุณ

  1. ขนาดของไฟล์ที่รันได้จะเพิ่มขึ้นอย่างมากหรือไม่ถ้าคุณใช้ C ++

ปฏิบัติการอาจมีขนาดใหญ่ขึ้นเล็กน้อยเมื่อรวบรวมเป็น C ++ เทียบกับรหัส C ที่คล้ายกันสร้างขึ้นเช่น อย่างน้อยที่สุด C ++ ที่ปฏิบัติการได้จะมีประโยชน์ที่น่าสงสัยของ C ++ name-mangling สำหรับชื่อฟังก์ชั่นทั้งหมดเท่าที่สัญลักษณ์ใด ๆ จะถูกเก็บไว้ใน executable (และนั่นคือความจริงที่ว่าสิ่งใดมีให้สำหรับการโอเวอร์โหลดของคุณในครั้งแรก) ความแตกต่างนั้นมีขนาดใหญ่พอที่จะให้ความสำคัญกับคุณหรือไม่เป็นสิ่งที่คุณจะต้องพิจารณาจากการทดสอบ

  1. ไม่ว่าจะมีผลกระทบด้านลบต่อประสิทธิภาพที่เห็นได้ชัดเจนหรือไม่ถ้าคุณใช้ C ++

ฉันสงสัยว่าคุณจะเห็นความแตกต่างของประสิทธิภาพที่เห็นได้ชัดเจนสำหรับโค้ดที่คุณอธิบายเทียบกับอนาล็อก - ซีบริสุทธิ์

  1. ไม่ว่าจะเป็นรหัสอาจถูกนำมาใช้ซ้ำบนแพลตฟอร์มที่แตกต่างกันซึ่งมีเพียงคอมไพเลอร์ C เท่านั้น

ฉันจะโยนแสงที่แตกต่างออกไปเล็กน้อยในเรื่องนี้: หากคุณต้องการเชื่อมโยงรหัสที่คุณกำลังสร้างด้วย C ++ ไปยังรหัสอื่นดังนั้นรหัสอื่น ๆ ก็จะต้องเขียนด้วย C ++ และสร้างด้วย C ++ หรือคุณจะต้อง เพื่อให้บทบัญญัติพิเศษในรหัสของคุณเอง (ประกาศการเชื่อมโยง "C") ซึ่งนอกจากนี้คุณไม่สามารถทำได้สำหรับฟังก์ชั่นการโอเวอร์โหลดของคุณ ในทางกลับกันถ้าโค้ดของคุณเขียนใน C และคอมไพล์เป็น C ดังนั้นโค้ดอื่น ๆ สามารถลิงก์กับทั้งโมดูล C และ C ++ ปัญหาแบบนี้มักจะสามารถเอาชนะได้ด้วยการเปลี่ยนตาราง แต่เนื่องจากคุณไม่จำเป็นต้องใช้ C ++ ดังนั้นทำไมต้องยอมรับปัญหาดังกล่าวตั้งแต่แรก


4
"ไฟล์ปฏิบัติการอาจใหญ่กว่านี้เล็กน้อยเมื่อคอมไพล์เป็น C ++ ... เท่าที่สัญลักษณ์ใด ๆ จะถูกเก็บไว้ในไฟล์ปฏิบัติการ" เพื่อความเป็นธรรม แต่เครื่องมือเพิ่มประสิทธิภาพที่เหมาะสมใด ๆ ควรมีตัวเลือกตัวเชื่อมโยงเพื่อตัดสัญลักษณ์เหล่านี้ในบิลด์ "ปล่อย" ซึ่งหมายความว่าพวกมันจะขยายการดีบักบิลด์ของคุณเท่านั้น ฉันไม่คิดว่ามันเป็นการสูญเสียครั้งใหญ่ ในความเป็นจริงมันมักจะเป็นประโยชน์
Cody Grey

5

ย้อนกลับไปในวันนี้ใช้คอมไพเลอร์ C ++ เป็น“ ดีกว่า C” ได้รับการส่งเสริมเป็นกรณีการใช้งาน ในความเป็นจริงต้น C ++ นั้นเป็นสิ่งที่แน่นอน หลักการออกแบบพื้นฐานคือคุณสามารถใช้เฉพาะคุณสมบัติที่คุณต้องการและจะไม่ทำให้เกิดค่าใช้จ่ายของคุณสมบัติที่คุณไม่ได้ใช้ ดังนั้นคุณสามารถโอเวอร์โหลดฟังก์ชั่น (โดยการประกาศเจตนาผ่านทางoverloadคีย์เวิร์ด!) และส่วนที่เหลือของโครงการของคุณไม่เพียง แต่จะรวบรวมได้ดี แต่จะสร้างรหัสไม่เลวร้ายยิ่งกว่าคอมไพเลอร์ C จะผลิต

ตั้งแต่นั้นมาภาษาต่าง ๆ ค่อนข้างแตกต่าง

ทุกmallocรหัส C ของคุณจะเป็นข้อผิดพลาดประเภทไม่ตรงกัน - ไม่ใช่ปัญหาในกรณีของคุณโดยไม่มีหน่วยความจำแบบไดนามิก! เช่นเดียวกันvoidตัวชี้ทั้งหมดของคุณใน C จะเดินทางไปตามที่คุณจะต้องเพิ่มการปลดเปลื้องชัดเจน แต่ ... ทำไมคุณทำมันด้วยวิธีการที่ ... คุณจะถูกนำไปลงเส้นทางของการใช้ภาษา C ++ มีมากขึ้นและมากขึ้น

ดังนั้นจึงอาจเป็นไปได้ด้วยการทำงานพิเศษบางอย่าง แต่มันจะทำหน้าที่เป็นประตูสู่การยอมรับในระดับ C ++ ที่ใหญ่ขึ้น ในไม่กี่ปีที่ผู้คนจะบ่นเกี่ยวกับรหัสเดิมของคุณที่ดูเหมือนว่ามันถูกเขียนขึ้นในปี 1989 ในขณะที่พวกเขาแทนที่mallocสายของคุณด้วยการnewดึงออกบล็อกของรหัสของร่างกายวนรอบเพียงแค่เรียกอัลกอริทึมแทน คอมไพเลอร์ได้รับอนุญาตให้ทำสิ่งเล็กน้อย

ในทางกลับกันคุณรู้ไหมว่ามันจะเหมือนกันทุกอย่างที่คุณเขียนไว้ใน C ดังนั้นจะผิดหรือไม่ที่จะเขียนใน C แทนที่จะเป็น C ++ เมื่อมันมีอยู่จริง? หากคำตอบคือ "ไม่" แสดงว่าการใช้คุณสมบัติที่เลือกโดยเชอร์รี่จาก C ++ นั้นไม่สามารถผิดได้เช่นกัน


2

ภาษาการเขียนโปรแกรมหลายภาษามีวัฒนธรรมอย่างน้อยหนึ่งอย่างที่พัฒนารอบตัวพวกเขาและมีความคิดเฉพาะเกี่ยวกับสิ่งที่ภาษาควรจะ "เป็น" ในขณะที่มันควรจะเป็นไปได้ในทางปฏิบัติและมีประโยชน์ที่จะมีภาษาระดับต่ำที่เหมาะสมสำหรับการเขียนโปรแกรมระบบซึ่งเพิ่มภาษาถิ่นของ C ที่เหมาะสมสำหรับวัตถุประสงค์ดังกล่าวด้วยคุณสมบัติบางอย่างจาก C ++ ซึ่งจะเหมาะสมเช่นกันวัฒนธรรมรอบสองภาษา โดยเฉพาะอย่างยิ่งไม่ชอบการควบรวมกิจการ

ฉันได้อ่านคอมไพเลอร์ C แบบฝังที่รวมคุณสมบัติบางอย่างจาก C ++ รวมถึงความสามารถในการมี

foo.someFunction(a,b,c);

ตีความว่าเป็นหลัก

typeOfFoo_someFunction(foo, a, b, c);

เช่นเดียวกับความสามารถในการโอเวอร์โหลดฟังก์ชั่นแบบคงที่ (ปัญหาการเรียงชื่อเกิดขึ้นเมื่อส่งออกเท่านั้นฟังก์ชั่นโอเวอร์โหลด) ไม่มีเหตุผลที่คอมไพเลอร์ C ไม่สามารถสนับสนุนการทำงานดังกล่าวได้โดยไม่ต้องมีข้อกำหนดเพิ่มเติมเกี่ยวกับสภาพแวดล้อมการลิงก์และรันไทม์ แต่การคอมไพล์ของ C คอมไพเลอร์จำนวนมากสะท้อนการปฏิเสธเกือบทุกอย่างจาก C ++ เพื่อหลีกเลี่ยงภาระด้านสิ่งแวดล้อม ปฏิเสธคุณสมบัติที่ไม่ต้องเสียค่าใช้จ่าย ในขณะเดียวกันวัฒนธรรมของ C ++ นั้นมีความสนใจเพียงเล็กน้อยในทุกสภาพแวดล้อมที่ไม่สามารถรองรับคุณสมบัติทั้งหมดของภาษานั้นได้ เว้นแต่หรือจนกว่าวัฒนธรรมของ C จะเปลี่ยนแปลงเพื่อยอมรับคุณสมบัติดังกล่าวหรือวัฒนธรรมของการเปลี่ยนแปลง C ++ เพื่อส่งเสริมการใช้งานของชุดย่อยที่มีน้ำหนักเบารหัส "ไฮบริด" เหมาะที่จะรับผลกระทบจากข้อ จำกัด มากมายของทั้งสองภาษาในขณะที่ถูก จำกัด ประโยชน์ของการดำเนินงานในชุดรวม

หากแพลตฟอร์มรองรับทั้ง C และ C ++ รหัสไลบรารีพิเศษที่จำเป็นสำหรับการสนับสนุน C ++ จะทำให้การปฏิบัติการนั้นมีขนาดใหญ่ขึ้นแม้ว่าเอฟเฟกต์จะไม่ยอดเยี่ยมนัก การทำงานของ "คุณสมบัติ C" ภายใน C ++ จะไม่ได้รับผลกระทบโดยเฉพาะอย่างยิ่ง ปัญหาที่ใหญ่กว่าอาจเป็นวิธีที่เครื่องมือเพิ่มประสิทธิภาพ C และ C ++ จัดการกรณีมุมต่างๆ พฤติกรรมของชนิดข้อมูลใน C ส่วนใหญ่จะถูกกำหนดโดยเนื้อหาของบิตที่เก็บไว้ในนั้นและ C ++ มีประเภทของโครงสร้างที่ได้รับการยอมรับ (PODS - โครงสร้างข้อมูลเก่าแบบธรรมดา) ซึ่งความหมายส่วนใหญ่จะถูกกำหนดโดยบิตที่เก็บไว้ อย่างไรก็ตามทั้งมาตรฐาน C และ C ++ บางครั้งอนุญาตให้มีพฤติกรรมที่ตรงกันข้ามกับบิตโดยนัยที่จัดเก็บไว้และข้อยกเว้นของพฤติกรรม "ที่จัดเก็บบิต" นั้นแตกต่างกันระหว่างสองภาษา


1
ความคิดเห็นที่น่าสนใจ แต่ไม่ได้ตอบคำถามของ OP
R Sahu

@RSahu: รหัสที่เหมาะกับ "วัฒนธรรม" ที่อยู่รอบ ๆ ภาษานั้นมีแนวโน้มที่จะได้รับการสนับสนุนที่ดีขึ้นและสามารถปรับให้เข้ากับการใช้งานที่หลากหลายได้ง่ายกว่าโค้ดที่ไม่ได้ใช้ วัฒนธรรมของ C และ C ++ นั้นต่างกับการใช้งานที่ OP แนะนำฉันจะเพิ่มประเด็นเฉพาะเจาะจงเพิ่มเติมเกี่ยวกับคำถามที่เฉพาะเจาะจง
supercat

1
โปรดทราบว่ามีกลุ่มฝังตัว / การเงิน / เกมในคณะกรรมการมาตรฐาน C ++ ที่มุ่งแก้ไขสถานการณ์ที่ "น่าสนใจเล็กน้อย" ที่คุณอ้างว่าถูกทิ้ง
Yakk

@Yakk: ฉันจะยอมรับว่าฉันไม่ได้ติดตามโลก C ++ อย่างใกล้ชิดเพราะความสนใจของฉันอยู่ที่ C เป็นหลัก ฉันรู้ว่ามีความพยายามในการใช้ภาษาถิ่นที่ฝังตัวมากขึ้น แต่ฉันไม่คิดว่าพวกเขาจะไปได้ทุกที่
supercat

2

อีกหนึ่งปัจจัยสำคัญที่ควรพิจารณา: ใครก็ตามที่จะสืบทอดรหัสของคุณ

บุคคลนั้นจะเป็นโปรแกรมเมอร์ C ที่มีคอมไพเลอร์ C เสมอไหม? ผมว่าอย่างนั้น.

บุคคลนั้นจะเป็นโปรแกรมเมอร์ C ++ พร้อมคอมไพเลอร์ C ++ หรือไม่ ฉันต้องการแน่ใจอย่างมีเหตุผลเกี่ยวกับเรื่องนี้ก่อนที่จะทำให้รหัสของฉันขึ้นอยู่กับสิ่งเฉพาะเจาะจงของ C ++


2

ความแตกต่างเป็นคุณลักษณะที่ดีจริง ๆ ที่ C ++ มีให้ฟรี อย่างไรก็ตามมีแง่มุมอื่น ๆ ที่คุณอาจต้องพิจารณาเมื่อเลือกคอมไพเลอร์ มีทางเลือกสำหรับ polymorphism ใน C แต่การใช้มันสามารถทำให้คิ้วบางยกขึ้น ฟังก์ชั่นใช้ variadic โปรดดูที่Variadic ฟังก์ชั่นการกวดวิชา

ในกรณีของคุณมันจะเป็นอย่างไร

enum serialDataTypes
{
 INT =0,
 INT_P =1,
 ....
 }Arg_type_t;
....
....
void transmit(Arg_type_t serial_data_type, ...)
{
  va_list args;
  va_start(args, serial_data_type);

  switch(serial_data_type)
  {
    case INT: 
    //Send integer
    break;

    case INT_P:
    //Send data at integer pointer
    break;
    ...
   }
 va_end(args);
}

ฉันชอบวิธีการของฟิลลิปส์ แต่มันทำให้ห้องสมุดของคุณมีสายมากขึ้น ด้วยอินเตอร์เฟซข้างต้นที่สะอาด มันมีข้อเสียและท้ายที่สุดมันเป็นเรื่องของการเลือก


ฟังก์ชั่น Variadic เป็นหลักให้บริการกรณีการใช้งานที่ทั้งจำนวนข้อโต้แย้งและประเภทของพวกเขาเป็นตัวแปร มิฉะนั้นคุณไม่ต้องการมันและโดยเฉพาะอย่างยิ่งมันเป็น overkill สำหรับตัวอย่างเฉพาะของคุณ มันจะง่ายกว่าถ้าใช้ฟังก์ชั่นธรรมดาที่ยอมรับArg_type_tและvoid *ชี้ไปที่ข้อมูล ด้วยที่กล่าวว่าใช่การให้ฟังก์ชั่น (เดี่ยว) อาร์กิวเมนต์ที่บ่งชี้ว่าชนิดข้อมูลเป็นทางเลือกที่ทำงานได้จริง
John Bollinger

1

สำหรับกรณีของการโอเวอร์โหลดแบบ "ฟังก์ชั่น" แบบคงที่สำหรับประเภทที่แตกต่างกันสองสามแบบคุณอาจพิจารณาใช้ C11 แทนด้วย_Genericแมโครเครื่องจักรแทน ฉันรู้สึกว่ามันเพียงพอสำหรับความต้องการที่ จำกัด ของคุณ

ใช้คำตอบของ Philip Kendallคุณสามารถกำหนด:

#define transmit(X) _Generic((X),      \
   unsigned char*: transmit_uchar_buffer, \
   char*: transmit_char_buffer,           \
   unsigned char: transmit_uchar,         \
   char: transmit_char) ((X))

และรหัสtransmit(foo) สิ่งที่เป็นประเภทของfoo(ในสี่ประเภทที่ระบุไว้ข้างต้น)

หากคุณสนใจเฉพาะคอมไพเลอร์GCC (และใช้งานร่วมกันได้เช่นClang ) คุณสามารถพิจารณาส่วนขยาย__builtin_types_compatible_pของมันtypeofได้


1

การใช้คอมไพเลอร์ C ++ เป็นเพียงการปฏิบัติที่เกินความจำเป็นหรือไม่

จุดยืนของ IMHO คือใช่และฉันจะต้องกลายเป็นโรคจิตเภทเพื่อตอบคำถามนี้เพราะฉันรักทั้งสองภาษา แต่มันไม่มีอะไรเกี่ยวข้องกับประสิทธิภาพ แต่อย่างเช่นความปลอดภัยและการใช้ภาษาที่ใช้สำนวน

ซีไซด์

จากจุดยืนของ C ฉันพบว่ามันสิ้นเปลืองมากที่จะทำให้โค้ดของคุณต้องการ C ++ เพียงเพื่อใช้ฟังก์ชันโอเวอร์โหลด นอกจากว่าคุณจะใช้มันเพื่อความหลากหลายแบบคงที่ด้วยเทมเพลต C ++ มันเป็นเรื่องเล็ก ๆ น้อย ๆ ที่ได้มาจากการแลกเปลี่ยนกับการสร้างประโยคภาษาน้ำตาลสลับกับภาษาที่แตกต่างไปจากเดิมอย่างสิ้นเชิง นอกจากนี้หากคุณต้องการส่งออกฟังก์ชั่นของคุณไปยัง dylib (อาจเป็นหรือเป็นปัญหาที่ไม่ได้เกิดขึ้นจริง) คุณจะไม่สามารถทำเช่นนั้นได้อีกต่อไปเพื่อการบริโภคอย่างกว้างขวางด้วยสัญลักษณ์ชื่อที่มีชื่อเป็นภาษาต่างๆ

C ++ ด้านข้าง

จากมุมมอง C ++ คุณไม่ควรใช้ C ++ เช่น C ที่มีฟังก์ชั่นโหลดมากเกินไป นี่ไม่ใช่การหยิ่งยโสโวหาร แต่เกี่ยวข้องกับการใช้งานจริงของ C ++ ทุกวัน

ชนิดปกติของคุณรหัส C เป็นเพียงมีเหตุผลมีสติและ "ปลอดภัย" ในการเขียนถ้าคุณทำงานกับระบบการพิมพ์ C structsที่ห้ามสิ่งที่ต้องการใน เมื่อคุณทำงานในระบบที่สมบูรณ์ยิ่งขึ้นของ C ++ ฟังก์ชั่นประจำวันที่มีมูลค่ามหาศาลเช่นmemsetและmemcpyไม่กลายเป็นฟังก์ชั่นที่คุณควรพึ่งพาตลอดเวลา แต่โดยทั่วไปแล้วฟังก์ชั่นเหล่านี้เป็นฟังก์ชั่นที่คุณต้องการหลีกเลี่ยงเช่นโรคระบาดเนื่องจากด้วยประเภท C ++ คุณไม่ควรปฏิบัติต่อมันเช่นบิตบิตและไบต์ที่จะคัดลอกและสับไปมาและเป็นอิสระ แม้ว่ารหัสของคุณจะใช้สิ่งต่าง ๆ เช่นmemsetบนพื้นฐานและ POD UDT เท่านั้นในขณะนี้ทุกคนจะเพิ่ม ctor ลงใน UDT ใด ๆ ที่คุณใช้ (รวมถึงเพียงแค่เพิ่มสมาชิกที่ต้องการหนึ่งอย่างเช่นstd::unique_ptrสมาชิก) กับฟังก์ชั่นดังกล่าวหรือฟังก์ชั่นเสมือนจริงหรืออะไรก็ตามที่จัดเรียงมันทำให้การเข้ารหัส C-style ปกติของคุณไวต่อพฤติกรรมที่ไม่ได้กำหนด นำติดตัวไปจาก Herb Sutter

memcpyและmemcmpละเมิดระบบพิมพ์ การใช้memcpyเพื่อคัดลอกวัตถุก็เหมือนกับการทำเงินโดยใช้เครื่องถ่ายเอกสาร การใช้memcmpเพื่อเปรียบเทียบวัตถุก็เหมือนกับการเปรียบเทียบเสือดาวโดยนับจำนวนจุดของพวกมัน เครื่องมือและวิธีการอาจดูเหมือนว่าจะทำงาน แต่พวกเขาหยาบเกินไปที่จะยอมรับได้ วัตถุ C ++ นั้นเกี่ยวกับการซ่อนข้อมูล (ซึ่งเป็นหลักการที่ให้ผลกำไรสูงสุดในวิศวกรรมซอฟต์แวร์ดูรายการที่ 11): วัตถุที่ซ่อนข้อมูล (ดูรายการที่ 41) และประดิษฐ์ abstractions ที่แม่นยำสำหรับการคัดลอกข้อมูลผ่านผู้สร้างและผู้ดำเนินการกำหนด (ดูรายการ 52 ถึง 55) . การลิดรอนสิ่งที่มีmemcpyการละเมิดข้อมูลอย่างจริงจังและมักจะนำไปสู่การรั่วไหลของหน่วยความจำและทรัพยากร (ที่ดีที่สุด), ล่ม (แย่กว่า) หรือพฤติกรรมที่ไม่ได้กำหนด (เลวร้ายที่สุด) - มาตรฐานการเข้ารหัส C ++

นักพัฒนา C หลายคนจะไม่เห็นด้วยกับสิ่งนี้และถูกต้องเนื่องจากปรัชญานี้ใช้เฉพาะเมื่อคุณเขียนโค้ดใน C ++ คุณมักจะเขียนโค้ดมีปัญหามากถ้าคุณใช้ฟังก์ชั่นเช่นmemcpyเวลาทั้งหมดในรหัสที่สร้างเป็น C ++แต่ก็สมบูรณ์ดีถ้าคุณทำมันใน C ทั้งสองภาษามีความแตกต่างกันมากในเรื่องนี้เนื่องจากความแตกต่างในระบบประเภท มันดึงดูดมากที่จะดูที่คุณสมบัติย่อยทั้งสองนี้มีเหมือนกันและเชื่อว่าสามารถใช้งานได้เหมือนกันโดยเฉพาะอย่างยิ่งในด้าน C ++ แต่ C + รหัส (หรือรหัส C -) มักเป็นปัญหามากกว่าทั้ง C และ รหัส C ++

เช่นเดียวกันกับที่คุณไม่ควรใช้พูดmallocในบริบทของสไตล์ C (ซึ่งไม่เกี่ยวข้องกับ EH) หากสามารถเรียกใช้ฟังก์ชัน C ++ ใด ๆ โดยตรงซึ่งสามารถโยนได้ตั้งแต่นั้นมาคุณมีจุดออกโดยปริยายในฟังก์ชันของคุณซึ่งเป็นผลมาจาก ข้อยกเว้นที่คุณไม่สามารถตรวจจับการเขียนโค้ด C ได้อย่างมีประสิทธิภาพก่อนที่จะสามารถใช้freeหน่วยความจำนั้นได้ ดังนั้นเมื่อใดก็ตามที่คุณมีแฟ้มที่สร้างเป็น C ++ กับที่.cppขยายหรืออะไรก็ตามและมันไม่ประเภทเหล่านี้ทั้งหมดของสิ่งที่ชอบmalloc, memcpy, memset,qsortฯลฯ มันจะถามปัญหาเพิ่มเติมในบรรทัดถ้าไม่ได้อยู่แล้วยกเว้นว่าจะเป็นรายละเอียดการใช้งานของคลาสที่ทำงานกับชนิดดั้งเดิมเท่านั้นซึ่ง ณ จุดนั้นยังคงต้องดำเนินการยกเว้นเพื่อความปลอดภัย หากคุณเขียนรหัส c ++ คุณแทนต้องการโดยทั่วไปพึ่งพา RAII และใช้สิ่งที่ชอบvector, unique_ptr, shared_ptrฯลฯ และหลีกเลี่ยงปกติการเข้ารหัสแบบ C เมื่อเป็นไปได้

เหตุผลที่คุณสามารถเล่นกับใบมีดโกนในประเภทข้อมูล C และ X-ray และเล่นกับบิตและไบต์ของพวกเขาโดยไม่เกิดความเสียหายต่อหลักประกันในทีม (แม้ว่าคุณยังสามารถทำร้ายตัวเองด้วยวิธีใดก็ตาม) ไม่ใช่เพราะสิ่ง C ประเภทสามารถทำได้ แต่เนื่องจากสิ่งที่พวกเขาจะไม่สามารถทำได้. ทันทีที่คุณขยายระบบประเภท C เพื่อรวมคุณสมบัติ C ++ เช่น ctors, dtors และ vtables พร้อมกับการจัดการข้อยกเว้นรหัส C สำนวนทั้งหมดจะแสดงผลไกลอันตรายมากกว่าที่เป็นอยู่ในปัจจุบันและคุณจะเห็นรูปแบบใหม่ของ ปรัชญาและความคิดการพัฒนาซึ่งจะส่งเสริมให้รูปแบบที่แตกต่างกันอย่างสมบูรณ์ของการเขียนโปรแกรมตามที่คุณเห็นใน C ++ ซึ่งขณะนี้ถือว่าแม้จะใช้การทุจริตต่อหน้าที่ชี้ดิบสำหรับการเรียนที่จัดการหน่วยความจำตรงข้ามที่จะพูด, RAII unique_ptrสอดคล้องทรัพยากรเช่น ความคิดนั้นไม่ได้พัฒนาไปจากความปลอดภัยอย่างแท้จริง มันพัฒนามาจากสิ่งที่ C ++ ต้องการโดยเฉพาะอย่างยิ่งที่จะปลอดภัยต่อคุณสมบัติเช่นการจัดการข้อยกเว้นเนื่องจากสิ่งที่มันอนุญาตให้ผ่านระบบประเภทของมัน

ข้อยกเว้นความปลอดภัย

อีกครั้งที่คุณอยู่ในดินแดน C ++ ผู้คนจะคาดหวังว่ารหัสของคุณจะปลอดภัยยกเว้น ผู้คนอาจรักษารหัสของคุณในอนาคตเนื่องจากมันเขียนแล้วและคอมไพล์ใน C ++ และใช้std::vector, dynamic_cast, unique_ptr, shared_ptrฯลฯ ในรหัสที่เรียกว่าไม่ว่าโดยตรงหรือโดยอ้อมโดยรหัสของคุณโดยเชื่อว่ามันไม่น่ากลัว รหัส. ณ จุดนั้นเราต้องเผชิญหน้ากับโอกาสที่สิ่งต่าง ๆ จะโยนออกไปและเมื่อคุณใช้รหัส C ที่สวยงามและน่ารักอย่างสมบูรณ์แบบ:

int some_func(int n, ...)
{
    int* x = calloc(n, sizeof(int));
    if (x)
    {
        f(n, x); // some function which, now being a C++ function, may 
                 // throw today or in the future.
        ...
        free(x);
        return success;
    }
    return fail;
}

... ตอนนี้มันพัง จะต้องมีการเขียนใหม่เพื่อให้มีข้อยกเว้น:

int some_func(int n, ...)
{
    int* x = calloc(n, sizeof(int));
    if (x)
    {
        try
        {
            f(n, x); // some function which, now being a C++ function, may 
                     // throw today or in the future (maybe someone used
                     // std::vector inside of it).
        }
        catch (...)
        {
            free(x);
            throw;
        }
        ...
        free(x);
        return success;
    }
    return fail;
}

Gross! นี่คือเหตุผลที่นักพัฒนา C ++ ส่วนใหญ่ต้องการสิ่งนี้แทน:

void some_func(int n, ...)
{
    vector<int> x(n);
    f(x); // some function which, now being a C++ function, may throw today
          // or in the future.
}

ข้างต้นเป็น RAII สอดคล้องรหัสยกเว้นปลอดภัยของชนิดที่ c ++ throwนักพัฒนาโดยทั่วไปจะอนุมัติตั้งแต่ฟังก์ชั่นจะไม่รั่วไหลไม่มีที่บรรทัดของรหัสเรียกทางออกนัยเป็นผลมาจากการ

เลือกภาษา

คุณควรยอมรับระบบและปรัชญาของ C ++ กับ RAII, ข้อยกเว้นด้านความปลอดภัย, แม่แบบ, OOP, ฯลฯ หรือโอบกอด C ซึ่งส่วนใหญ่หมุนรอบบิตดิบและไบต์ คุณไม่ควรสร้างการแต่งงานที่ไม่บริสุทธิ์ระหว่างสองภาษานี้และแยกพวกเขาออกเป็นภาษาต่าง ๆ เพื่อให้ได้รับการปฏิบัติที่แตกต่างกันมากแทนที่จะเบลอพวกเขาด้วยกัน

ภาษาเหล่านี้ต้องการแต่งงานกับคุณ โดยทั่วไปคุณต้องเลือกอย่างใดอย่างหนึ่งแทนการออกเดทและเล่นกับทั้งคู่ หรือคุณอาจเป็น polygamist อย่างฉันและแต่งงานทั้งคู่ แต่คุณต้องเปลี่ยนความคิดของคุณอย่างสมบูรณ์เมื่อใช้เวลากับอีกคนหนึ่งและแยกพวกเขาออกจากกันเพื่อให้พวกเขาไม่ได้ต่อสู้กัน

ขนาดไบนารี

เพิ่งอยากรู้อยากเห็นฉันพยายามใช้รายการฟรีของฉันและมาตรฐานในขณะนี้และย้ายไปยัง C ++ เนื่องจากฉันอยากรู้เกี่ยวกับเรื่องนี้:

[... ] ไม่รู้ว่ามันจะเป็นอย่างไรเพราะฉันไม่ได้ใช้คอมไพเลอร์ C

... และต้องการทราบว่าขนาดไบนารีจะพองได้เพียงแค่สร้างเป็น C ++ หรือไม่ มันทำให้ฉันต้องพรมออกไปอย่างชัดเจนทั่วสถานที่ซึ่งน่าเกลียด (เหตุผลหนึ่งที่ฉันชอบเขียนสิ่งที่ต่ำเช่นตัวจัดสรรและโครงสร้างข้อมูลใน C ดีกว่า) แต่ใช้เวลาเพียงไม่กี่นาที

นี้เป็นเพียงการเปรียบเทียบ MSVC 64 บิตปล่อยสร้างสำหรับแอปคอนโซลที่เรียบง่ายและมีรหัสที่ไม่ได้ใช้ C ++ ใด ๆ คุณสมบัติไม่ได้ดำเนินงานมาก - เพียงแค่ความแตกต่างระหว่างการสร้างมันด้วย C และการใช้การพูด, <cstdlib>แทน<stdlib.h>และ สิ่งต่าง ๆ เช่นนั้น แต่ฉันประหลาดใจที่พบว่ามันสร้างความแตกต่างให้กับขนาดไบนารี่!

ไบนารีคือ9,728ไบต์เมื่อมันถูกสร้างขึ้นใน C และในทำนองเดียวกัน9,278ไบต์เมื่อรวบรวมเป็นรหัส C ++ ฉันไม่ได้คาดหวังสิ่งนั้นจริงๆ ฉันคิดว่าสิ่งต่าง ๆ เช่น EH อย่างน้อยก็จะเพิ่มนิดหน่อยที่นั่น (คิดว่าอย่างน้อยก็จะเหมือนร้อยไบต์ที่แตกต่างกัน) แม้ว่าอาจจะสามารถที่จะคิดว่าไม่จำเป็นต้องเพิ่มคำแนะนำที่เกี่ยวข้องกับ EH เพราะฉันเพิ่ง ใช้ไลบรารี่มาตรฐาน C และไม่มีอะไรผิดพลาด ฉันคิดอะไรบางอย่างจะเพิ่มขนาดไบนารีลงไปเล็กน้อยเช่น RTTI อย่างไรก็ตามมันก็เจ๋งดีที่เห็นว่า แน่นอนฉันไม่คิดว่าคุณควรพูดคุยจากผลลัพธ์นี้ แต่อย่างน้อยก็ทำให้ฉันประทับใจเล็กน้อย มันไม่ได้ส่งผลกระทบต่อมาตรฐานและเป็นธรรมชาติดังนั้นเนื่องจากฉันคิดว่าขนาดไบนารีที่เหมือนกันที่เกิดขึ้นนั้นก็หมายถึงคำแนะนำของเครื่องที่เกิดขึ้นเหมือนกัน

ที่กล่าวว่าใครสนใจขนาดไบนารีด้วยประเด็นความปลอดภัยและวิศวกรรมที่กล่าวถึงข้างต้น ดังนั้นอีกครั้งเลือกภาษาและยอมรับปรัชญาของมันแทนที่จะพยายามลบล้างมัน นั่นคือสิ่งที่ฉันแนะนำ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.