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

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

6
ตัวอย่างสำหรับ boost shared_mutex (การอ่านหลายครั้ง / การเขียนหนึ่งครั้ง)?
ฉันมีแอปมัลติเธรดที่ต้องอ่านข้อมูลบ่อยครั้งและมีการอัปเดตข้อมูลเป็นครั้งคราว ตอนนี้ mutex ช่วยให้เข้าถึงข้อมูลนั้นได้อย่างปลอดภัย แต่มีราคาแพงเพราะฉันต้องการให้หลายเธรดสามารถอ่านพร้อมกันได้และล็อคเฉพาะเมื่อจำเป็นต้องอัปเดตเท่านั้น (เธรดการอัปเดตอาจรอให้เธรดอื่นเสร็จสิ้น) . ฉันคิดว่านี่คือสิ่งที่boost::shared_mutexควรทำ แต่ฉันไม่ชัดเจนในการใช้งานและยังไม่พบตัวอย่างที่ชัดเจน ใครมีตัวอย่างง่ายๆที่ฉันสามารถใช้เริ่มต้นได้บ้าง?

30
แนวทางปฏิบัติในการเข้ารหัสซึ่งช่วยให้คอมไพเลอร์ / เครื่องมือเพิ่มประสิทธิภาพสร้างโปรแกรมได้เร็วขึ้น
หลายปีก่อนคอมไพเลอร์ C ไม่ค่อยฉลาดนัก ในฐานะที่เป็นวิธีแก้ปัญหา K&R ได้คิดค้นคีย์เวิร์ดregisterเพื่อบอกใบ้ถึงคอมไพเลอร์ว่าอาจเป็นความคิดที่ดีที่จะเก็บตัวแปรนี้ไว้ในรีจิสเตอร์ภายใน พวกเขายังสร้างตัวดำเนินการระดับอุดมศึกษาเพื่อช่วยสร้างรหัสที่ดีขึ้น เมื่อเวลาผ่านไปคอมไพเลอร์ก็ครบกำหนด พวกเขาฉลาดมากที่การวิเคราะห์โฟลว์ช่วยให้ตัดสินใจได้ดีขึ้นเกี่ยวกับค่าที่จะเก็บไว้ในรีจิสเตอร์มากกว่าที่คุณจะทำได้ คีย์เวิร์ด register ไม่สำคัญ FORTRAN อาจเร็วกว่า C สำหรับการดำเนินการบางประเภทเนื่องจากปัญหานามแฝง ในทางทฤษฎีด้วยการเข้ารหัสอย่างรอบคอบเราสามารถหลีกเลี่ยงข้อ จำกัด นี้เพื่อให้เครื่องมือเพิ่มประสิทธิภาพสร้างรหัสที่เร็วขึ้น มีแนวทางปฏิบัติในการเข้ารหัสอะไรบ้างที่อาจทำให้คอมไพลเลอร์ / เครื่องมือเพิ่มประสิทธิภาพสร้างโค้ดได้เร็วขึ้น การระบุแพลตฟอร์มและคอมไพเลอร์ที่คุณใช้จะได้รับการชื่นชม ทำไมเทคนิคนี้ดูเหมือนจะใช้ได้ผล? ขอแนะนำโค้ดตัวอย่าง นี่คือคำถามที่เกี่ยวข้อง [แก้ไข] คำถามนี้ไม่เกี่ยวกับกระบวนการโดยรวมในการสร้างโปรไฟล์และเพิ่มประสิทธิภาพ สมมติว่าโปรแกรมได้รับการเขียนอย่างถูกต้องรวบรวมด้วยการเพิ่มประสิทธิภาพเต็มรูปแบบทดสอบและนำไปใช้ในการผลิต อาจมีโครงสร้างในโค้ดของคุณที่ห้ามไม่ให้เครื่องมือเพิ่มประสิทธิภาพทำงานให้ดีที่สุดเท่าที่จะทำได้ คุณสามารถทำอะไรได้บ้างในการ refactor ที่จะลบข้อห้ามเหล่านี้และอนุญาตให้เครื่องมือเพิ่มประสิทธิภาพสร้างรหัสได้เร็วขึ้น [แก้ไข] ลิงก์ที่เกี่ยวข้องกับออฟเซ็ต

8
สามารถตรวจพบความแตกต่างอะไรระหว่าง C ++ 03 และ C ++ 11 ในขณะรันไทม์
เป็นไปได้ที่จะเขียนฟังก์ชันซึ่งเมื่อคอมไพล์ด้วยคอมไพเลอร์ C จะส่งกลับ 0 และเมื่อคอมไพล์ด้วยคอมไพเลอร์ C ++ จะส่งคืน 1 (การเจือจางเล็กน้อยด้วย #ifdef __cplusplusไม่น่าสนใจ) ตัวอย่างเช่น: int isCPP() { return sizeof(char) == sizeof 'c'; } แน่นอนข้างต้นจะใช้ได้ก็ต่อเมื่อsizeof (char)ไม่เหมือนกับsizeof (int) อีกวิธีหนึ่งที่พกพาสะดวกกว่าคือสิ่งนี้: int isCPP() { typedef int T; { struct T { int a[2]; }; return sizeof(T) == sizeof(struct T); } } ฉันไม่แน่ใจว่าตัวอย่างถูกต้อง 100% แต่คุณเข้าใจแล้ว ฉันเชื่อว่ามีวิธีอื่นในการเขียนฟังก์ชันเดียวกันด้วย …

2
โปรแกรมที่คอมไพล์แตกต่างกันในคอมไพเลอร์ C ++ หลัก 3 ตัว คนไหนที่ใช่?
จากการติดตามผลที่น่าสนใจ (ไม่ใช่เรื่องสำคัญในทางปฏิบัติ) สำหรับคำถามก่อนหน้าของฉัน: เหตุใด C ++ จึงอนุญาตให้เราล้อมรอบชื่อตัวแปรในวงเล็บเมื่อประกาศตัวแปร ฉันพบว่าการรวมการประกาศในวงเล็บกับคุณสมบัติชื่อคลาสที่ฉีดเข้าด้วยกันอาจนำไปสู่ผลลัพธ์ที่น่าประหลาดใจเกี่ยวกับพฤติกรรมของคอมไพเลอร์ ดูโปรแกรมต่อไปนี้: #include <iostream> struct B { }; struct C { C (){ std::cout << "C" << '\n'; } C (B *) { std::cout << "C (B *)" << '\n';} }; B *y = nullptr; int main() { C::C (y); } การคอมไพล์ด้วย g …

25
ส่วนที่ใช้มากที่สุดของ Boost [ปิด]
ตามที่กล่าวไว้ในปัจจุบันคำถามนี้ไม่เหมาะสำหรับรูปแบบถาม & ตอบของเรา เราคาดหวังว่าคำตอบจะได้รับการสนับสนุนจากข้อเท็จจริงการอ้างอิงหรือความเชี่ยวชาญ แต่คำถามนี้อาจก่อให้เกิดการถกเถียงโต้แย้งการสำรวจความคิดเห็นหรือการอภิปรายเพิ่มเติม หากคุณรู้สึกว่าคำถามนี้สามารถปรับปรุงได้และอาจเปิดใหม่ได้โปรดไปที่ศูนย์ช่วยเหลือเพื่อรับคำแนะนำ ปิดให้บริการใน7 ปีที่ผ่านมา เมื่อฉันค้นพบboost::lexical_castฉันก็คิดกับตัวเองว่า "ทำไมฉันไม่รู้เรื่องนี้เร็วกว่านี้!" - ฉันเกลียดการเขียนโค้ดแบบ stringstream ss; ss << anIntVal; mystring = ss.str(); ตอนนี้ฉันเขียน mystring = boost::lexical_cast<string>(anIntVal); เมื่อวานนี้ใน stackoverflow ฉันเจอการแยกการเพิ่มประสิทธิภาพ (อัญมณีอื่นที่จะช่วยฉันเขียนโค้ด) string stringtobesplit = "AA/BB-CC") vector<string> tokens; boost::split(tokens, stringtobesplit, boost::is_any_of("/-")); // tokens now holds 3 items: AA BB CC ฉันกำลังจะเริ่มดูเอกสารบูสต์โดยมองหาฟังก์ชั่นอื่น ๆ ที่ฉันจะสามารถใช้ได้เป็นประจำ แต่ฉันรู้สึกว่ามันจะพลาดง่ายมาก …
116 c++  boost 

12
การต่อ const char *
ฉันต้องการเชื่อมอักขระ const สองตัวเข้าด้วยกันดังนี้: const char *one = "Hello "; const char *two = "World"; ฉันจะทำอย่างนั้นได้อย่างไร? ฉันส่งผ่านสิ่งเหล่านี้char*มาจากไลบรารีของบุคคลที่สามที่มีอินเทอร์เฟซ C ดังนั้นฉันจึงไม่สามารถใช้std::stringแทนได้

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

14
ฉันควรใช้ C ++ private inheritance เมื่อใด
ซึ่งแตกต่างจากมรดกที่ได้รับการป้องกันการสืบทอดส่วนตัวของ C ++ พบวิธีในการพัฒนา C ++ กระแสหลัก อย่างไรก็ตามฉันยังไม่พบการใช้งานที่ดี พวกคุณใช้มันเมื่อไหร่?
116 c++  oop 

2
ตัวอย่างที่ดีสำหรับ boost :: algorithm :: join
เมื่อเร็ว ๆ นี้ฉันต้องการใช้boost :: algorithm :: joinแต่ฉันไม่พบตัวอย่างการใช้งานใด ๆ และฉันไม่ต้องการเสียเวลามากมายในการเรียนรู้ไลบรารี Boost Range เพียงเพื่อใช้ฟังก์ชันนี้ ใครสามารถให้ตัวอย่างที่ดีในการใช้การเข้าร่วมในคอนเทนเนอร์ของสตริงได้หรือไม่? ขอบคุณ
116 c++  string  boost  join 

5
ใช้เทมเพลตภายนอก (C ++ 11)
รูปที่ 1: เทมเพลตฟังก์ชัน TemplHeader.h template<typename T> void f(); TemplCpp.cpp template<typename T> void f(){ //... } //explicit instantation template void f<T>(); main.cpp #include "TemplHeader.h" extern template void f<T>(); //is this correct? int main() { f<char>(); return 0; } นี่เป็นวิธีใช้ที่ถูกต้องextern templateหรือฉันใช้คีย์เวิร์ดนี้เฉพาะกับเทมเพลตคลาสดังรูปที่ 2 รูปที่ 2: เทมเพลตคลาส TemplHeader.h template<typename T> class foo { T …
116 c++  templates  c++11  extern 

5
ความผิดพลาดในการแบ่งกลุ่มในขนาดอาร์เรย์ขนาดใหญ่
รหัสต่อไปนี้ทำให้ฉันมีข้อผิดพลาดในการแบ่งกลุ่มเมื่อทำงานบนเครื่อง 2Gb แต่ทำงานบนเครื่อง 4GB int main() { int c[1000000]; cout << "done\n"; return 0; } ขนาดของอาร์เรย์เป็นเพียง 4Mb มีการ จำกัด ขนาดของอาร์เรย์ที่สามารถใช้ใน c ++ หรือไม่?

2
ฉันสามารถรวบรวมไฟล์. cpp ทั้งหมดใน src / ถึง. ของใน obj / แล้วเชื่อมโยงไปยังไบนารีใน. / ได้หรือไม่
ไดเรกทอรีโครงการของฉันมีลักษณะดังนี้: /project Makefile main /src main.cpp foo.cpp foo.h bar.cpp bar.h /obj main.o foo.o bar.o สิ่งที่ฉันต้องการ Makefile ของฉันจะทำจะรวบรวมทุก.cppไฟล์ใน/srcโฟลเดอร์.oไฟล์ใน/objโฟลเดอร์แล้วเชื่อมโยงทุก.oไฟล์ในเข้าไปในไบนารีการส่งออกในโฟลเดอร์ระดับบนสุด/obj/project ฉันไม่มีประสบการณ์กับ Makefiles เลยและฉันไม่แน่ใจจริงๆว่าจะค้นหาอะไรเพื่อให้บรรลุเป้าหมายนี้ นอกจากนี้นี่เป็นวิธีที่ "ดี" ในการทำเช่นนี้หรือมีแนวทางที่เป็นมาตรฐานมากกว่าสำหรับสิ่งที่ฉันกำลังพยายามทำอยู่หรือไม่

1
const หมายถึง thread-safe ใน C ++ 11 หรือไม่?
ผมได้ยินว่าconstหมายถึงด้ายปลอดภัยในC ++ 11 เป็นเช่นนั้นจริงหรือ? หมายความว่าconstตอนนี้เทียบเท่าของJava 's synchronized? พวกเขาใช้คีย์เวิร์ดหมดหรือไม่

11
เหตุใดจึงไม่มี `int pow (int base, int exponent)` ในไลบรารี C ++ มาตรฐาน
ฉันรู้สึกว่าฉันต้องไม่สามารถหามันเจอได้ มีเหตุผลใดที่powฟังก์ชันC ++ ไม่ใช้ฟังก์ชัน "power" สำหรับสิ่งใด ๆ ยกเว้นfloats และdoubles? ฉันรู้ว่าการใช้งานนั้นไม่สำคัญฉันแค่รู้สึกว่าฉันกำลังทำงานที่ควรอยู่ในไลบรารีมาตรฐาน ฟังก์ชั่นการใช้พลังงานที่แข็งแกร่ง (เช่นจัดการกับการล้นด้วยวิธีที่ชัดเจนและสม่ำเสมอ) ไม่ใช่เรื่องสนุกที่จะเขียน

9
'const int' กับ 'int const' เป็นพารามิเตอร์ฟังก์ชันใน C ++ และ C
พิจารณา: int testfunc1 (const int a) { return a; } int testfunc2 (int const a) { return a; } สองหน้าที่นี้เหมือนกันทุกประการหรือไม่หรือมีความแตกต่างกันอย่างไร? ฉันสนใจคำตอบสำหรับภาษา C แต่ถ้ามีอะไรน่าสนใจในภาษา C ++ ฉันก็อยากรู้เช่นกัน
116 c++  c  const 

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