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

C ++ เป็นภาษาโปรแกรมทั่วไป เดิมได้รับการออกแบบให้เป็นส่วนขยายของ C และมีไวยากรณ์ที่คล้ายกัน แต่ตอนนี้มันเป็นภาษาที่แตกต่างอย่างสิ้นเชิง ใช้แท็กนี้สำหรับคำถามเกี่ยวกับรหัส (จะ) คอมไพล์ด้วยคอมไพเลอร์ C ++ ใช้แท็กเฉพาะรุ่นสำหรับคำถามที่เกี่ยวข้องกับการแก้ไขมาตรฐานเฉพาะ [C ++ 11], [C ++ 14], [C ++ 17] หรือ [C ++ 20] เป็นต้น

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

11
เนมสเปซที่ไม่มีชื่อ / ไม่ระบุชื่อเปรียบเทียบกับฟังก์ชั่นแบบคงที่
คุณลักษณะของ C ++ คือความสามารถในการสร้างเนมสเปซที่ไม่มีชื่อ (ไม่ระบุชื่อ) เช่น: namespace { int cannotAccessOutsideThisFile() { ... } } // namespace คุณอาจคิดว่าฟีเจอร์ดังกล่าวจะไร้ประโยชน์เนื่องจากคุณไม่สามารถระบุชื่อของเนมสเปซจึงเป็นไปไม่ได้ที่จะเข้าถึงสิ่งต่าง ๆ ภายในจากภายนอก แต่เหล่านี้ namespaces ชื่อเป็นเข้าถึงภายในไฟล์ที่พวกเขากำลังสร้างขึ้นในขณะที่ถ้าคุณมีนัยใช้ข้อให้กับพวกเขา คำถามของฉันคือทำไมหรือเมื่อไรที่สิ่งนี้ดีกว่าที่จะใช้ฟังก์ชั่นแบบคงที่? หรือว่าพวกเขากำลังทำสิ่งเดียวกันแน่นอนสองวิธี?
507 c++  namespaces 

5
เทมเพลตคำหลัก 'typename' และ 'class' ต่างกันหรือไม่?
สำหรับเทมเพลตฉันเห็นการประกาศทั้งสอง: template < typename T > template < class T > ความแตกต่างคืออะไร? และคำหลักเหล่านั้นหมายถึงอะไรในตัวอย่างต่อไปนี้ (นำมาจากบทความ Wikipedia เกี่ยวกับเทมเพลตในภาษาเยอรมัน) template < template < typename, typename > class Container, typename Type > class Example { Container< Type, std::allocator < Type > > baz; };
504 c++  templates  keyword 

23
ซึ่งเร็วกว่า: การจัดสรรสแต็กหรือการจัดสรรฮีป
คำถามนี้อาจฟังดูค่อนข้างธรรมดา แต่เป็นการอภิปรายที่ฉันมีกับผู้พัฒนารายอื่นที่ฉันทำงานด้วย ฉันกำลังดูแลการจัดสรรสิ่งต่าง ๆ ที่ฉันสามารถทำได้แทนที่จะกองพวกเขา เขากำลังพูดกับฉันและเฝ้าไหล่ของฉันและแสดงความคิดเห็นว่ามันไม่จำเป็นเพราะมันเป็นการแสดงที่ฉลาดเหมือนกัน ฉันอยู่ภายใต้การแสดงผลเสมอว่าการเติบโตของสแต็กนั้นเป็นเวลาที่คงที่และประสิทธิภาพของการจัดสรรฮีปขึ้นอยู่กับความซับซ้อนในปัจจุบันของฮีปสำหรับการจัดสรรทั้งสอง (การหารูขนาดที่เหมาะสม) และการจัดสรร (ยุบหลุมเพื่อลดการกระจายตัว การใช้งานไลบรารีมาตรฐานจำนวนมากต้องใช้เวลาในการทำสิ่งนี้ในระหว่างการลบหากฉันไม่ผิดพลาด) สิ่งนี้ทำให้ฉันเป็นสิ่งที่อาจต้องพึ่งพาผู้แปล สำหรับโครงการนี้โดยเฉพาะฉันใช้คอมไพเลอร์MetrowerksสำหรับสถาปัตยกรรมPPC ข้อมูลเชิงลึกเกี่ยวกับชุดค่าผสมนี้จะมีประโยชน์มากที่สุด แต่โดยทั่วไปสำหรับ GCC และ MSVC ++ กรณีนี้คืออะไร การจัดสรรฮีปไม่สูงเท่ากับประสิทธิภาพการจัดสรรสแต็กหรือไม่ ไม่มีความแตกต่าง? หรือความแตกต่างดังนั้นนาทีมันกลายเป็นไมโครเพิ่มประสิทธิภาพไม่มีจุดหมาย
503 c++  performance  memory  stack  heap 

5
มาตรฐาน C ++ อนุญาตให้บูลที่ไม่กำหนดค่าเริ่มต้นขัดข้องโปรแกรมหรือไม่
ฉันรู้ว่า"พฤติกรรมที่ไม่ได้กำหนด"ใน C ++ สามารถอนุญาตให้คอมไพเลอร์ทำสิ่งที่ต้องการได้ อย่างไรก็ตามฉันมีข้อผิดพลาดที่ทำให้ฉันประหลาดใจเพราะฉันคิดว่ารหัสนั้นปลอดภัยพอ ในกรณีนี้ปัญหาจริงเกิดขึ้นเฉพาะแพลตฟอร์มที่ใช้คอมไพเลอร์เฉพาะและเฉพาะในกรณีที่เปิดใช้งานการเพิ่มประสิทธิภาพ ฉันลองหลายสิ่งหลายอย่างเพื่อทำให้เกิดปัญหาอีกครั้งและทำให้มันง่ายขึ้นสูงสุด นี่คือการแยกฟังก์ชั่นที่เรียกSerializeว่าจะใช้พารามิเตอร์บูลและคัดลอกสตริงtrueหรือfalseไปยังบัฟเฟอร์ปลายทางที่มีอยู่ ฟังก์ชั่นนี้จะอยู่ในการตรวจสอบรหัสหรือไม่ไม่มีทางที่จะบอกได้ว่าในความเป็นจริงอาจมีปัญหาหากพารามิเตอร์ bool เป็นค่าเริ่มต้นหรือไม่ // Zero-filled global buffer of 16 characters char destBuffer[16]; void Serialize(bool boolValue) { // Determine which string to print based on boolValue const char* whichString = boolValue ? "true" : "false"; // Compute the length of the string we …

27
Templated ตรวจสอบการมีอยู่ของฟังก์ชันสมาชิกคลาสหรือไม่
เป็นไปได้ไหมที่จะเขียนเทมเพลตที่เปลี่ยนลักษณะการทำงานขึ้นอยู่กับว่าฟังก์ชั่นสมาชิกบางตัวมีการกำหนดไว้ในคลาสหรือไม่? นี่คือตัวอย่างง่ายๆของสิ่งที่ฉันต้องการเขียน: template<class T> std::string optionalToString(T* obj) { if (FUNCTION_EXISTS(T->toString)) return obj->toString(); else return "toString not defined"; } ดังนั้นหากclass TมีการtoString()กำหนดไว้แล้วมันจะใช้มัน มิฉะนั้นจะไม่ ส่วนมหัศจรรย์ที่ฉันไม่รู้ว่าต้องทำอย่างไรคือส่วน "FUNCTION_EXISTS"


12
ตรวจสอบว่าสตริงมีสตริงใน C ++ หรือไม่
std::stringฉันมีตัวแปรประเภท std::stringฉันต้องการที่จะตรวจสอบว่ามันมีบางอย่าง ฉันจะทำอย่างไร มีฟังก์ชั่นที่คืนค่าจริงหากพบสตริงและเท็จถ้าไม่ใช่?
493 c++  string  substring 

8
int กับ size_t ที่ไม่ได้ลงชื่อ
ฉันสังเกตว่ารหัส C และ C ++ ที่ทันสมัยดูเหมือนว่าจะใช้size_tแทนint/ unsigned intสวยมากทุกที่ - จากพารามิเตอร์สำหรับฟังก์ชันสตริง C ถึง STL ฉันอยากรู้ว่าเหตุผลนี้และประโยชน์ที่จะได้รับ
492 c++  c  size-t 


11
ฉันจะแสดงรายการสัญลักษณ์ในไฟล์. so ได้อย่างไร
ฉันจะแสดงรายการสัญลักษณ์ที่ส่งออกจากไฟล์. so ได้อย่างไร ถ้าเป็นไปได้ฉันก็อยากจะรู้แหล่งที่มาของมัน (เช่นถ้าพวกมันถูกดึงเข้ามาจากห้องสมุดคง) ฉันใช้ gcc 4.0.2 ถ้านั่นสร้างความแตกต่าง
486 c++  c  gcc  symbols  name-mangling 

9
เหตุใดจึงมีไฟล์ส่วนหัวและไฟล์. cpp [ปิด]
ตามที่เป็นอยู่ในปัจจุบันคำถามนี้ไม่เหมาะสำหรับรูปแบบคำถาม & คำตอบของเรา เราคาดหวังว่าคำตอบจะได้รับการสนับสนุนจากข้อเท็จจริงการอ้างอิงหรือความเชี่ยวชาญ แต่คำถามนี้อาจเรียกร้องให้มีการอภิปรายโต้แย้งโต้แย้งหรือการอภิปรายเพิ่มเติม หากคุณรู้สึกว่าคำถามนี้สามารถปรับปรุงและเปิดใหม่ได้โปรดไปที่ศูนย์ช่วยเหลือเพื่อขอคำแนะนำ ปิดให้บริการใน7 ปีที่ผ่านมา เหตุใด C ++ จึงมีไฟล์ส่วนหัวและไฟล์. cpp
484 c++  header-files 

16
ฉันจะแปลง std :: string เป็น int ได้อย่างไร
เพียงแค่มีคำถามด่วน ฉันดูรอบ ๆ อินเทอร์เน็ตเล็กน้อยและฉันพบวิธีแก้ปัญหาเล็กน้อย แต่ยังไม่มีวิธีแก้ปัญหาใด ๆ เลย ดูที่การแปลงสตริงเป็น int และฉันไม่ได้หมายถึงรหัส ASCII สำหรับ run-down อย่างรวดเร็วเราถูกส่งผ่านในสมการเป็นสตริง เราต้องทำลายมันจัดรูปแบบให้ถูกต้องและแก้สมการเชิงเส้น ตอนนี้โดยบอกว่าฉันไม่สามารถแปลงสตริงเป็น int ได้ ฉันรู้ว่าสตริงจะอยู่ในรูปแบบ (-5) หรือ (25) เป็นต้นดังนั้นมันจึงเป็น int อย่างแน่นอน แต่เราจะแยกมันออกจากสตริงได้อย่างไร วิธีหนึ่งที่ฉันคิดว่าใช้สำหรับ / วนรอบสตริงตรวจสอบตัวเลขแยกตัวเลขทั้งหมดหลังจากนั้นแล้วดูว่ามีผู้นำ '-' ถ้ามีคูณ int ด้วย - 1 ดูเหมือนว่าจะซับซ้อนกว่าเล็กน้อยสำหรับปัญหาเล็ก ๆ น้อย ๆ ความคิดใด ๆ
484 c++  string  int 


5
ฉันจะใช้อาร์เรย์ใน C ++ ได้อย่างไร
C ++ สืบทอดมาจาก C ที่พวกเขาใช้งานได้ทุกที่ C ++ ให้ abstractions ที่ใช้ง่ายกว่าและมีข้อผิดพลาดน้อยลง ( std::vector<T>ตั้งแต่ C ++ 98 และstd::array<T, n>ตั้งแต่C ++ 11 ) ดังนั้นความต้องการอาร์เรย์ไม่ได้เกิดขึ้นบ่อยเท่าใน C อย่างไรก็ตามเมื่อคุณอ่าน legacy รหัสหรือโต้ตอบกับไลบรารีที่เขียนใน C คุณควรมีความเข้าใจอย่างถ่องแท้เกี่ยวกับวิธีการทำงานของอาร์เรย์ คำถามที่พบบ่อยนี้แบ่งออกเป็นห้าส่วน: อาร์เรย์ในระดับประเภทและองค์ประกอบการเข้าถึง การสร้างและการเริ่มต้นอาร์เรย์ การมอบหมายและการส่งพารามิเตอร์ อาร์เรย์หลายมิติและอาร์เรย์ของพอยน์เตอร์ ข้อผิดพลาดทั่วไปเมื่อใช้อาร์เรย์ หากคุณรู้สึกว่าสิ่งสำคัญขาดหายไปในคำถามที่พบบ่อยนี้ให้เขียนคำตอบและเชื่อมโยงที่นี่เป็นส่วนเพิ่มเติม ในข้อความต่อไปนี้ "อาร์เรย์" หมายถึง "อาร์เรย์ C" std::arrayไม่ใช่แม่แบบชั้นเรียน มีความรู้พื้นฐานเกี่ยวกับไวยากรณ์ของตัวประกาศ C โปรดทราบว่าการใช้งานด้วยตนเองnewและdeleteแสดงให้เห็นด้านล่างเป็นอันตรายอย่างยิ่งในการเผชิญกับข้อยกเว้น แต่ที่เป็นหัวข้อของคำถามที่พบบ่อยอีก (หมายเหตุ: นี่คือหมายถึงการเป็นรายการที่จะกองมากเกินของ C ++ คำถามที่พบบ่อย . …

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