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

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

3
<random> สร้างหมายเลขเดียวกันใน Linux แต่ไม่ใช่ใน Windows
รหัสด้านล่างนี้มีไว้เพื่อสร้างรายการตัวเลขสุ่มหลอกห้าหมายเลขในช่วงเวลา [1,100] ฉันเมล็ดdefault_random_engineด้วยtime(0)ซึ่งจะส่งกลับเวลาของระบบในเวลายูนิกซ์ เมื่อฉันรวบรวมและเรียกใช้โปรแกรมนี้บน Windows 7 โดยใช้ Microsoft Visual Studio 2013 มันทำงานได้ตามที่คาดไว้ (ดูด้านล่าง) อย่างไรก็ตามเมื่อฉันทำใน Arch Linux ด้วยคอมไพเลอร์ g ++ มันทำงานแปลก ๆ ใน Linux จะมีการสร้างตัวเลข 5 ตัวในแต่ละครั้ง ตัวเลข 4 ตัวสุดท้ายจะแตกต่างกันในแต่ละการดำเนินการ (ซึ่งมักจะเป็นเช่นนั้น) แต่ตัวเลขแรกจะยังคงเหมือนเดิม ตัวอย่างผลลัพธ์จากการดำเนินการ 5 ครั้งบน Windows และ Linux: | Windows: | Linux: --------------------------------------- Run 1 | 54,01,91,73,68 | 25,38,40,42,21 Run 2 …

6
ข้อผิดพลาด: ฟรี (): ขนาดถัดไปไม่ถูกต้อง (เร็ว):
ข้อผิดพลาดแปลก ๆ ที่ฉันได้รับคืออะไร? ฉันกำลังรวบรวม C ++ โดยใช้ g ++ บน Ubuntu 10.10 มันจะปรากฏขึ้นแบบสุ่มเมื่อฉันเรียกใช้ไฟล์ปฏิบัติการ (อาจจะ 2 ครั้งใน 8 ชั่วโมงโดยมีการคอมไพล์ 10 ครั้งต่อชั่วโมง) อย่างไรก็ตามหากฉันทำความสะอาดและคอมไพล์ใหม่มันจะหายไปเกือบตลอดเวลา *** glibc detected *** ./emailQueue.app: free(): invalid next size (fast): 0x0000000001c40270 *** ======= Backtrace: ========= /lib/libc.so.6(+0x774b6)[0x7f490d95e4b6] /lib/libc.so.6(cfree+0x73)[0x7f490d964c83] ./emailQueue.app[0x401f47] /lib/libc.so.6(__libc_start_main+0xfe)[0x7f490d905d8e] ./emailQueue.app[0x401cc9] ======= Memory map: ======== 00400000-0040d000 r-xp 00000000 08:01 1311132 …
91 c++  g++ 

2
สับสนเมื่อ boost :: asio :: io_service เรียกใช้เมธอดบล็อก / ปลดบล็อก
ในฐานะที่เป็นผู้เริ่มต้น Boost ทั้งหมด Asio ฉันสับสนกับio_service::run(). ฉันจะขอบคุณถ้ามีใครสามารถอธิบายให้ฉันฟังได้เมื่อวิธีนี้บล็อก / ปลดบล็อก เอกสารระบุ: run()บล็อกฟังก์ชั่จนกว่าการทำงานทั้งหมดได้เสร็จสิ้นและมีรถขนไม่มากที่จะส่งหรือจนกว่าจะio_serviceได้รับการหยุด เธรดหลายเธรดอาจเรียกใช้run()ฟังก์ชันเพื่อตั้งค่ากลุ่มเธรดซึ่งio_serviceอาจเรียกใช้งานตัวจัดการ เธรดทั้งหมดที่รออยู่ในพูลจะเทียบเท่ากันและio_serviceอาจเลือกเธรดใดก็ได้เพื่อเรียกใช้ตัวจัดการ การออกจากrun()ฟังก์ชันปกติหมายความว่าio_serviceวัตถุหยุดทำงาน ( stopped()ฟังก์ชันจะคืนค่าจริง) โทรตามมาrun(), run_one(), poll()หรือจะกลับทันทีจนกว่าจะมีการเรียกร้องก่อนที่จะpoll_one()reset() ข้อความต่อไปนี้หมายถึงอะไร? [... ] ไม่มีตัวจัดการอีกต่อไปที่จะถูกส่ง [... ] ในขณะที่พยายามทำความเข้าใจพฤติกรรมของio_service::run()ฉันก็เจอตัวอย่างนี้(ตัวอย่างที่ 3a) ภายในนั้นฉันสังเกตว่าio_service-&gt;run()บล็อกนั้นและรอคำสั่งงาน // WorkerThread invines io_service-&gt;run() void WorkerThread(boost::shared_ptr&lt;boost::asio::io_service&gt; io_service); void CalculateFib(size_t); boost::shared_ptr&lt;boost::asio::io_service&gt; io_service( new boost::asio::io_service); boost::shared_ptr&lt;boost::asio::io_service::work&gt; work( new boost::asio::io_service::work(*io_service)); // ... boost::thread_group worker_threads; for(int x …
91 c++  boost-asio 

8
การสร้างเนมสเปซ C ++ ในส่วนหัวและแหล่งที่มา (cpp)
มีความแตกต่างระหว่างการตัดทั้งเนื้อหาส่วนหัวและไฟล์ cpp ในเนมสเปซหรือการตัดเฉพาะเนื้อหาส่วนหัวแล้วใช้เนมสเปซในไฟล์ cpp หรือไม่ โดยความแตกต่างฉันหมายถึงโทษประสิทธิภาพการจัดเรียงหรือความหมายที่แตกต่างกันเล็กน้อยที่อาจทำให้เกิดปัญหาหรืออะไรก็ตามที่ฉันต้องระวัง ตัวอย่าง: // header namespace X { class Foo { public: void TheFunc(); }; } // cpp namespace X { void Foo::TheFunc() { return; } } VS // header namespace X { class Foo { public: void TheFunc(); }; } // cpp using namespace X; …
91 c++  namespaces 


7
ใช้ดำเนินการต่อในคำสั่งสวิตช์
ฉันต้องการข้ามจากตรงกลางของswitchคำสั่งไปยังคำสั่งวนซ้ำในรหัสต่อไปนี้: while (something = get_something()) { switch (something) { case A: case B: break; default: // get another something and try again continue; } // do something for a handled something do_something(); } วิธีนี้ใช้ได้continueหรือไม่ มีcontinueงบโดยไม่สนใจswitchงบ? C และ C ++ แตกต่างกันในพฤติกรรมของพวกเขาที่นี่หรือไม่?


4
C ++ auto & vs auto
เมื่อสร้างตัวแปรท้องถิ่นใช้ถูกต้อง(const) auto&amp;หรือautoไม่? เช่น: SomeClass object; const auto result = object.SomeMethod(); หรือ const auto&amp; result = object.SomeMethod(); โดยที่ SomeMethod () ส่งคืนค่าที่ไม่ใช่พื้นฐาน - อาจเป็นประเภทอื่นที่ผู้ใช้กำหนดเอง ความเข้าใจของฉันconst auto&amp; resultถูกต้องเนื่องจากผลลัพธ์ที่ SomeMethod () ส่งคืนจะเรียกตัวสร้างการคัดลอกสำหรับชนิดที่ส่งคืน กรุณาแก้ไขฉันถ้าฉันผิด สิ่งที่เกี่ยวกับประเภทดั้งเดิม? ฉันถือว่าconst auto sum = 1 + 2;ถูกต้อง สิ่งนี้ใช้กับช่วงที่อิงกับลูปด้วยหรือไม่ for(const auto&amp; object : objects)
91 c++  auto 

10
คำสั่ง if - การประเมินการลัดวงจรเทียบกับความสามารถในการอ่าน
บางครั้งคำสั่งจะมีความซับซ้อนมากกว่าหรือยาวดังนั้นเพื่อประโยชน์ของการอ่านมันจะดีกว่าที่จะดึงสายซับซ้อนก่อนifif เช่นนี้: if (SomeComplicatedFunctionCall() || OtherComplicatedFunctionCall()) { // do stuff } ในสิ่งนี้ bool b1 = SomeComplicatedFunctionCall(); bool b2 = OtherComplicatedFunctionCall(); if (b1 || b2) { //do stuff } (ตัวอย่างเช่นระบุไม่ใช่ว่าไม่ดีก็เพียงเพื่อประกอบการอธิบาย ... จินตนาการสายอื่น ๆ ที่มีข้อโต้แย้งหลายอื่น ๆ ) แต่ด้วยการสกัดนี้ฉันสูญเสียการประเมินการลัดวงจร (SCE) ฉันแพ้ SCE ทุกครั้งหรือไม่? มีสถานการณ์บางอย่างที่คอมไพเลอร์ได้รับอนุญาตให้ "ปรับให้เหมาะสม" และยังคงให้ SCE อยู่หรือไม่ มีวิธีการรักษาความสามารถในการอ่านที่ดีขึ้นของตัวอย่างข้อมูลที่สองโดยไม่สูญเสีย SCE หรือไม่

5
std :: การเปรียบเทียบสตริง (ตรวจสอบว่าสตริงเริ่มต้นด้วยสตริงอื่นหรือไม่)
ฉันต้องการตรวจสอบว่า std: string ขึ้นต้นด้วย "xyz" หรือไม่ ฉันจะทำได้อย่างไรโดยไม่ต้องค้นหาสตริงทั้งหมดหรือสร้างสตริงชั่วคราวด้วย substr ()
90 c++  string  stl  compare 

2
นี่คืออะไร (( ))?
ขณะเรียกดูซอร์สโค้ดคอมไพเลอร์ gcc (gcc / c-family / c-pragma.c) ฉันเห็น: typedef struct GTY(()) align_stack { int alignment; tree id; struct align_stack * prev; } align_stack; และไม่ว่าฉันจะมีการเขียนโปรแกรม C มาหลายปีก็ตามบิตเหล่านี้: (())ยังไม่เป็นที่รู้จักสำหรับฉันเลย ใครช่วยอธิบายความหมายได้บ้าง Google ดูเหมือนจะไม่พบ
90 c++  c 

16
ฉันได้ยินมาว่า i ++ ไม่ปลอดภัยต่อเธรด ++ i เธรดปลอดภัยหรือไม่
ฉันได้ยินมาว่า i ++ ไม่ใช่คำสั่งที่ปลอดภัยต่อเธรดเนื่องจากในการประกอบมันจะลดลงไปที่การจัดเก็บค่าดั้งเดิมเป็นอุณหภูมิที่ใดที่หนึ่งเพิ่มขึ้นแล้วแทนที่ซึ่งอาจถูกขัดจังหวะโดยสวิตช์บริบท อย่างไรก็ตามฉันสงสัยเกี่ยวกับ ++ i เท่าที่ฉันสามารถบอกได้สิ่งนี้จะลดลงเป็นคำสั่งประกอบเดียวเช่น 'เพิ่ม r1, r1, 1' และเนื่องจากเป็นเพียงคำสั่งเดียวจึงไม่สามารถขัดจังหวะได้โดยสวิตช์บริบท ใครช่วยชี้แจงหน่อย ฉันสมมติว่ามีการใช้แพลตฟอร์ม x86
90 c++  c  multithreading 

3
วิธีสร้าง typedef ตามเงื่อนไขใน C ++
ฉันกำลังพยายามทำสิ่งนี้: #include &lt;iostream&gt; #include &lt;random&gt; typedef int Integer; #if sizeof(Integer) &lt;= 4 typedef std::mt19937 Engine; #else typedef std::mt19937_64 Engine; #endif int main() { std::cout &lt;&lt; sizeof(Integer) &lt;&lt; std::endl; return 0; } แต่ฉันได้รับข้อผิดพลาดนี้: error: missing binary operator before token "(" ฉันจะทำให้พิมพ์ดีดตามเงื่อนไขถูกต้องได้อย่างไร
90 c++  c++11 

4
ทำไม memmove เร็วกว่า memcpy?
ฉันกำลังตรวจสอบฮอตสปอตประสิทธิภาพในแอปพลิเคชันซึ่งใช้เวลา 50% ใน memmove (3) แอปพลิเคชันจะแทรกจำนวนเต็ม 4 ไบต์นับล้านลงในอาร์เรย์ที่จัดเรียงและใช้ memmove เพื่อเลื่อนข้อมูล "ไปทางขวา" เพื่อให้มีพื้นที่ว่างสำหรับค่าที่แทรก ความคาดหวังของฉันคือการคัดลอกหน่วยความจำนั้นเร็วมากและฉันรู้สึกประหลาดใจที่ใช้เวลากับ memmove นานมาก แต่แล้วฉันก็มีความคิดว่า memmove ทำงานช้าเพราะมันกำลังเคลื่อนย้ายพื้นที่ที่ทับซ้อนกันซึ่งจะต้องดำเนินการแบบวนซ้ำแทนการคัดลอกหน่วยความจำขนาดใหญ่ ฉันเขียน microbenchmark ขนาดเล็กเพื่อดูว่ามีความแตกต่างด้านประสิทธิภาพระหว่าง memcpy และ memmove หรือไม่โดยคาดหวังว่า memcpy จะชนะมือ ฉันใช้เกณฑ์มาตรฐานบนสองเครื่อง (core i5, core i7) และเห็นว่า memmove เร็วกว่า memcpy จริง ๆ บน core i7 ที่เก่ากว่าแม้จะเร็วกว่าเกือบสองเท่า! ตอนนี้ผมกำลังหาคำอธิบาย นี่คือเกณฑ์มาตรฐานของฉัน มันคัดลอก 100 mb ด้วย memcpy จากนั้นย้ายประมาณ …
90 c++  c  performance  memory 

2
เกิดข้อผิดพลาดเมื่อใช้การเตรียมใช้งานในคลาสของสมาชิกข้อมูลที่ไม่คงที่และตัวสร้างคลาสที่ซ้อนกัน
โค้ดต่อไปนี้ค่อนข้างไม่สำคัญและฉันคาดว่ามันควรจะคอมไพล์ได้ดี struct A { struct B { int i = 0; }; B b; A(const B&amp; _b = B()) : b(_b) {} }; ฉันได้ทดสอบโค้ดนี้กับ g ++ เวอร์ชัน 4.7.2, 4.8.1, clang ++ 3.2 และ 3.3 นอกเหนือจากข้อเท็จจริงที่ว่า g ++ 4.7.2 segfaults ในโค้ดนี้ ( http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57770 ) คอมไพเลอร์ที่ผ่านการทดสอบอื่น ๆ ยังให้ข้อความแสดงข้อผิดพลาดที่ไม่ได้อธิบายอะไรมาก g ++ 4.8.1: test.cpp: …

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