คำถามติดแท็ก c++

คำถามเกี่ยวกับ C ++ ซึ่งเป็นภาษาการเขียนแบบสแตติกแบบหลายกระบวนทัศน์รวบรวมภาษาการเขียนโปรแกรมสำหรับวัตถุประสงค์ทั่วไป

7
เหตุใดจึงประกาศตัวแปรในหนึ่งบรรทัดและกำหนดให้กับตัวแปรในบรรทัดถัดไป
ฉันมักจะเห็นในรหัส C และ C ++ การประชุมต่อไปนี้: some_type val; val = something; some_type *ptr = NULL; ptr = &something_else; แทน some_type val = something; some_type *ptr = &something_else; ตอนแรกฉันคิดว่านี่เป็นนิสัยที่เหลือจากวันที่คุณต้องประกาศตัวแปรท้องถิ่นทั้งหมดที่ด้านบนของขอบเขต แต่ฉันเรียนรู้ที่จะไม่เลิกนิสัยนักพัฒนามืออาชีพอย่างรวดเร็ว ดังนั้นมีเหตุผลที่ดีสำหรับการประกาศในหนึ่งบรรทัดและกำหนดในภายหลังหรือไม่
101 c++  c 

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


8
C ++ สมัยใหม่เปลี่ยน C # หรือไม่ Microsoft กำลังผลักดันนักพัฒนาให้ปรับใช้ C ++ หรือไม่ [ปิด]
ฉันได้ยินเกี่ยวกับความนิยม C ++ ที่ทันสมัยและบางคนพูดถึงการย้ายกลับไปที่ C ++ จาก C # หรือภาษาอื่น ๆ ที่คล้าย C ฉันรู้เกี่ยวกับคุณสมบัติ C ++ 11 แต่ฉันอยากได้ยินประสบการณ์ของคุณโดยเฉพาะจากนักพัฒนาที่ย้ายจาก C # เป็น C ++ ที่สำคัญกว่านั้น Microsoft ผลักดันให้นักพัฒนาใช้ C ++ หรือไม่ ถ้าใช่ทำไม
91 c#  c++ 

8
จะดีกว่าการทำเอกสารฟังก์ชั่นในไฟล์ส่วนหัวหรือไฟล์ต้นฉบับ?
ในภาษาที่แยกความแตกต่างระหว่างไฟล์ "แหล่งที่มา" และ "ส่วนหัว" (ส่วนใหญ่ C และ C ++) จะดีกว่าฟังก์ชั่นเอกสารในไฟล์ส่วนหัวหรือไม่: (ขโมยจากCCAN ) /** * time_now - return the current time * * Example: * printf("Now is %lu seconds since epoch\n", (long)time_now().tv_sec); */ struct timeval time_now(void); หรือในไฟล์ต้นฉบับ? (ขโมยจาก PostgreSQL) /* * Convert a UTF-8 character to a Unicode code point. * …
86 c++  c  headers 

11
นักพัฒนาซอฟต์แวร์ของ Java ได้ละทิ้ง RAII หรือไม่?
ในฐานะโปรแกรมเมอร์ C # เป็นเวลานานฉันเพิ่งได้เรียนรู้เพิ่มเติมเกี่ยวกับข้อดีของการได้มาซึ่งทรัพยากรคือการเริ่มต้น (RAII) โดยเฉพาะฉันได้ค้นพบว่าสำนวน C #: using (var dbConn = new DbConnection(connStr)) { // do stuff with dbConn } มี C ++ ที่เทียบเท่า: { DbConnection dbConn(connStr); // do stuff with dbConn } หมายความว่าการจดจำการใช้ทรัพยากรเช่นDbConnectionในusingบล็อกนั้นไม่จำเป็นใน C ++! สิ่งนี้ดูเหมือนจะเป็นข้อได้เปรียบที่สำคัญของ C ++ สิ่งนี้น่าเชื่อถือยิ่งขึ้นเมื่อคุณพิจารณาคลาสที่มีสมาชิกอินสแตนซ์ของประเภทDbConnectionตัวอย่างเช่น class Foo { DbConnection dbConn; // ... } ใน …
82 java  c#  c++  language-design 

15
ทำไม Java ถึงเป็นไปได้เร็วกว่า C ++?
บางครั้ง Java มีประสิทธิภาพสูงกว่า C ++ ในการวัดประสิทธิภาพ แน่นอนว่าบางครั้ง C ++ มีประสิทธิภาพสูงกว่า ดูลิงค์ต่อไปนี้: http://keithlea.com/javabench/ http://blog.dhananjaynene.com/2008/07/performance-comparison-c-java-python-ruby-jython-jruby-groovy/ http://blog.cfelde.com/2010/06/c-vs-java-performance/ แต่สิ่งนี้เป็นไปได้อย่างไร มันรบกวนความคิดของฉันที่การแปลรหัสโดยโค้ดอาจเร็วกว่าภาษาที่คอมไพล์ ใครช่วยอธิบายหน่อยได้ไหม? ขอบคุณ!
79 java  c++  performance 

5
เหตุใดจึงไม่มีระบบการจัดการแพ็คเกจสำหรับ C และ C ++ [ปิด]
มีภาษาการเขียนโปรแกรมบางอย่างซึ่งมีอยู่ในระบบการจัดการบรรจุภัณฑ์: CTANสำหรับ TeX CPANสำหรับ Perl Pip & Eggsสำหรับ Python Mavenสำหรับ Java พันธมิตรสำหรับ Haskell อัญมณีสำหรับทับทิม npmสำหรับ NodeJS bowerสำหรับ Javascript & CSS ส่วนหน้า นักเก็ตสำหรับ C # นักแต่งเพลงสำหรับ PHP มีภาษาอื่นที่ใช้ระบบดังกล่าวหรือไม่? แล้ว C และ C ++ ล่ะ? (นั่นเป็นคำถามหลัก!) ทำไมไม่มีระบบดังกล่าวสำหรับพวกเขา? และไม่ได้มีการสร้างแพคเกจสำหรับyum, apt-getหรือระบบการจัดการแพคเกจอื่น ๆ ทั่วไปดีขึ้นหรือไม่
78 c++  c  builds  packages 

20
การแทนที่รหัสที่ได้รับการปรับปรุงด้วยรหัสที่อ่านได้นั้นเป็นเรื่องปกติหรือไม่
บางครั้งคุณพบสถานการณ์ที่คุณต้องขยาย / ปรับปรุงบางรหัสที่มีอยู่ คุณจะเห็นว่ารหัสเก่านั้นผอมมาก แต่มันก็ยากที่จะขยายและใช้เวลาในการอ่าน มันเป็นความคิดที่ดีที่จะแทนที่ด้วยรหัสที่ทันสมัย? ก่อนหน้านี้ฉันชอบวิธีการแบบลีน แต่ตอนนี้ฉันคิดว่ามันจะดีกว่าถ้าเสียสละจำนวนมากเพื่อเพิ่มประสิทธิภาพให้กับ abstractions ที่สูงขึ้นอินเตอร์เฟสที่ดีขึ้นและโค้ดที่อ่านได้และสามารถขยายได้มากขึ้น คอมไพเลอร์ดูเหมือนว่าจะเริ่มดีขึ้นเช่นกันดังนั้นสิ่งต่าง ๆ เช่นstruct abc = {}กลายเป็นเงียบ ๆmemset, shared_ptrs ค่อนข้างผลิตรหัสเดียวกันเป็นตัวชี้ดิบ twiddling, แม่แบบทำงานได้ดีสุดเพราะพวกเขาผลิตรหัสซุปเปอร์ลีนและอื่น ๆ แต่ถึงกระนั้นบางครั้งคุณก็เห็นอาร์เรย์ตามสแต็กและฟังก์ชั่น C เก่าที่มีตรรกะคลุมเครือและมักจะไม่ได้อยู่ในเส้นทางที่สำคัญ เป็นความคิดที่ดีที่จะเปลี่ยนรหัสดังกล่าวถ้าคุณต้องสัมผัสชิ้นส่วนเล็ก ๆ ด้วยวิธีใด?

12
ประโยชน์ของการเขียนโปรแกรมเชิงวัตถุบนการเขียนโปรแกรมตามขั้นตอนคืออะไร
ฉันพยายามที่จะเข้าใจความแตกต่างระหว่างภาษาเชิงปฏิบัติเช่น C และภาษาเชิงวัตถุเช่น C ++ ฉันไม่เคยใช้ C ++ แต่ฉันได้คุยกับเพื่อน ๆ เกี่ยวกับวิธีแยกแยะทั้งสอง ฉันได้รับการบอกว่า C ++ มีแนวคิดเชิงวัตถุเช่นเดียวกับโหมดสาธารณะและส่วนตัวสำหรับการกำหนดตัวแปร: สิ่งที่ C ไม่มี ฉันไม่เคยใช้สิ่งเหล่านี้ในขณะที่กำลังพัฒนาโปรแกรมใน Visual Basic.NET: ประโยชน์ของสิ่งเหล่านี้คืออะไร? ฉันได้รับแจ้งด้วยว่าหากตัวแปรเป็นแบบสาธารณะมันสามารถเข้าถึงได้ทุกที่ แต่ไม่ชัดเจนว่ามันแตกต่างจากตัวแปรทั่วโลกในภาษาเช่น C หรือไม่และยังไม่ชัดเจนว่าตัวแปรส่วนตัวแตกต่างจากตัวแปรท้องถิ่นอย่างไร อีกสิ่งหนึ่งที่ฉันได้ยินคือเพื่อเหตุผลด้านความปลอดภัยหากจำเป็นต้องเข้าถึงฟังก์ชั่นควรได้รับการสืบทอดก่อน กรณีใช้งานคือผู้ดูแลระบบควรมีสิทธิ์มากเท่าที่ต้องการและไม่ใช่ทุกอย่าง แต่ดูเหมือนว่าเงื่อนไขจะทำงานได้ดี: if ( login == "admin") { // invoke the function } ทำไมสิ่งนี้จึงไม่เหมาะ เนื่องจากดูเหมือนว่าจะมีวิธีการในการทำทุกอย่างที่เกี่ยวกับวัตถุทำไมฉันจึงควรใส่ใจเกี่ยวกับการเขียนโปรแกรมเชิงวัตถุ

11
เหตุใดจึงเป็นพื้นฐานสำหรับวัตถุทั้งหมดท้อแท้ใน C ++
Stroustrup กล่าวว่า "อย่าคิดค้นฐานเฉพาะสำหรับคลาสทั้งหมดของคุณ (คลาส Object) โดยทันทีคุณสามารถทำได้ดีกว่านี้หากไม่มีคลาสที่มากที่สุด / ส่วนใหญ่" (ภาษา C ++ ภาษาที่สี่รุ่น Sec 1.3.4) ทำไมพื้นฐานสำหรับทุกสิ่งโดยทั่วไปเป็นความคิดที่ไม่ดีและเมื่อใดที่เหมาะสมที่จะสร้าง

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

6
`catch (…) {throw; } `การปฏิบัติที่ไม่ดี?
ในขณะที่ฉันเห็นด้วยว่าการจับ... โดยไม่ต้องทำใหม่เป็นสิ่งที่ผิด แต่ฉันเชื่อว่าการใช้โครงสร้างเช่นนี้ try { // Stuff } catch (...) { // Some cleanup throw; } เป็นที่ยอมรับในกรณีที่ RAII ไม่ได้บังคับ (โปรดอย่าถาม ... ทุกคนใน บริษัท ของฉันชอบการเขียนโปรแกรมเชิงวัตถุและ RAII มักถูกมองว่าเป็น "สิ่งที่ไร้ประโยชน์ต่อโรงเรียน" ... ) เพื่อนร่วมงานของฉันบอกว่าคุณควรรู้อยู่เสมอว่าจะมีข้อยกเว้นอะไรบ้างและคุณสามารถใช้โครงสร้างเช่น: try { // Stuff } catch (exception_type1&) { // Some cleanup throw; } catch (exception_type2&) { // Some cleanup throw; …
74 c++ 

19
เหตุใดฉันจึงต้องใส่ใจเกี่ยวกับประสิทธิภาพของไมโครและประสิทธิภาพ?
คำถามและคำตอบมากมายในหน้า C / C ++ โดยเฉพาะหรือหารือเกี่ยวกับปัญหาประสิทธิภาพการทำงานของไมโคร (เช่นค่าใช้จ่ายของฟังก์ชั่น vs vs direct vs inline ทางอ้อม) หรือการใช้อัลกอริทึมO (N 2 ) vs O (N log N) รายการ 100 รายการ ฉันมักจะเขียนโค้ดโดยไม่ต้องกังวลเกี่ยวกับประสิทธิภาพของไมโครและความกังวลเล็กน้อยเกี่ยวกับประสิทธิภาพของมาโครโดยมุ่งเน้นที่การบำรุงรักษาที่ง่ายและเชื่อถือได้นอกจากว่าฉันรู้ว่าฉันมีปัญหา คำถามของฉันคือเหตุใดโปรแกรมเมอร์จำนวนมากจึงสนใจ? มันเป็นปัญหาสำหรับนักพัฒนาส่วนใหญ่จริง ๆ หรือไม่ฉันเพิ่งโชคดีพอที่จะไม่ต้องกังวลกับมันมากเกินไปหรือฉันเป็นโปรแกรมเมอร์ที่ไม่ดี?

3
อะไรคือสาเหตุที่ไม่ใช้ [c ++ 17 ของ [nodiscard]] เกือบทุกที่ในรหัสใหม่
C ++ 17 แนะนำ[[nodiscard]]คุณสมบัติซึ่งอนุญาตให้โปรแกรมเมอร์ทำเครื่องหมายฟังก์ชั่นในลักษณะที่คอมไพเลอร์สร้างคำเตือนหากวัตถุที่ถูกส่งคืนถูกยกเลิกโดยผู้เรียก สามารถเพิ่มแอตทริบิวต์เดียวกันในประเภทคลาสทั้งหมดได้ ฉันได้อ่านเกี่ยวกับแรงจูงใจของคุณลักษณะนี้ในข้อเสนอเดิมและฉันรู้ว่า C ++ 20 จะเพิ่มคุณสมบัติให้กับฟังก์ชั่นมาตรฐานเช่นstd::vector::emptyชื่อของผู้ที่ไม่ได้สื่อความหมายที่ชัดเจนเกี่ยวกับค่าส่งคืน มันเป็นคุณสมบัติที่ยอดเยี่ยมและมีประโยชน์ ในความเป็นจริงมันดูเหมือนว่ามีประโยชน์มากเกินไป ทุกที่ที่ฉันอ่าน[[nodiscard]]คนพูดถึงราวกับว่าคุณเพิ่งเพิ่มไปยังฟังก์ชั่นหรือประเภทที่เลือกและลืมส่วนที่เหลือ แต่ทำไมค่าที่ไม่สามารถละทิ้งได้ควรเป็นกรณีพิเศษโดยเฉพาะเมื่อเขียนโค้ดใหม่ ค่าส่งคืนที่ถูกทิ้งมักจะเป็นข้อบกพร่องหรืออย่างน้อยก็เป็นการสิ้นเปลืองทรัพยากรหรือไม่ และไม่ใช่หนึ่งในหลักการออกแบบของ C ++ ที่คอมไพเลอร์ควรตรวจจับข้อผิดพลาดให้ได้มากที่สุด ถ้าเป็นเช่นนั้นทำไมไม่เพิ่ม[[nodiscard]]รหัสที่ไม่ใช่มรดกของคุณเองลงในvoidฟังก์ชั่นที่ไม่ใช่ฟังก์ชั่นเดียวและเกือบทุกประเภทของคลาส? ฉันพยายามที่จะทำในรหัสของตัวเองและมันทำงานได้ดียกเว้นว่ามัน verbose ชะมัดว่ามันเริ่มรู้สึกเหมือน Java มันจะดูเหมือนธรรมชาติมากขึ้นที่จะทำให้คอมไพเลอร์เตือนเกี่ยวกับการคืนค่าทิ้งไปโดยปริยาย ยกเว้นสำหรับกรณีอื่น ๆ ไม่กี่ที่คุณทำเครื่องหมายความตั้งใจของคุณ[*] ตามที่ฉันได้เห็นการอภิปรายเป็นศูนย์เกี่ยวกับความเป็นไปได้นี้ในข้อเสนอมาตรฐานรายการบล็อกคำถามซ้อนมากเกินไปหรือที่อื่นบนอินเทอร์เน็ตฉันต้องหายไปบางสิ่งบางอย่าง ทำไมกลศาสตร์ดังกล่าวไม่สมเหตุสมผลในรหัส C ++ ใหม่ การใช้คำฟุ่มเฟื่อยเป็นเหตุผลเดียวที่จะไม่ใช้[[nodiscard]]เกือบทุกที่? [*] ตามทฤษฏีคุณอาจมีลักษณะคล้ายกับ[[maydiscard]]แอตทริบิวต์แทนซึ่งสามารถเพิ่มย้อนหลังให้กับฟังก์ชั่นเช่นprintfในการใช้งานไลบรารีมาตรฐาน
70 c++ 

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