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

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

7
การอ่านและเขียนไฟล์ไบนารี
ฉันกำลังพยายามเขียนโค้ดเพื่ออ่านไฟล์ไบนารีลงในบัฟเฟอร์จากนั้นเขียนบัฟเฟอร์ไปยังไฟล์อื่น ฉันมีรหัสต่อไปนี้ แต่บัฟเฟอร์เก็บอักขระ ASCII เพียงไม่กี่ตัวจากบรรทัดแรกในไฟล์และไม่มีอะไรอื่น int length; char * buffer; ifstream is; is.open ("C:\\Final.gif", ios::binary ); // get length of file: is.seekg (0, ios::end); length = is.tellg(); is.seekg (0, ios::beg); // allocate memory: buffer = new char [length]; // read data as a block: is.read (buffer,length); is.close(); FILE *pFile; pFile …
108 c++  file  binary  buffer 

2
C ++ 11 unique_ptr และ shared_ptr สามารถแปลงเป็นประเภทของกันและกันได้หรือไม่?
ไม่ C ++ 11 ห้องสมุดมาตรฐานให้ยูทิลิตี้ใด ๆ ที่จะแปลงจากstd::shared_ptrไปstd::unique_ptrหรือกลับกัน? การดำเนินการนี้ปลอดภัยหรือไม่?

3
ทำไมประเภทจำนวนเต็มแบบเร็วจึงเร็วกว่าประเภทจำนวนเต็มอื่น ๆ
ใน ISO / IEC 9899: 2018 (C18) แสดงไว้ภายใต้ 7.20.1.3: 7.20.1.3 ประเภทจำนวนเต็มความกว้างต่ำสุดที่เร็วที่สุด 1 แต่ละประเภทต่อไปนี้กำหนดประเภทจำนวนเต็มที่มักจะเร็วที่สุด268)เพื่อใช้งานกับประเภทจำนวนเต็มทั้งหมดที่มีความกว้างอย่างน้อยที่ระบุ 2 ชื่อ typedef int_fastN_tกำหนดประเภทจำนวนเต็มที่เร็วที่สุดที่ลงนามด้วยความกว้างอย่างน้อย N ชื่อ typedef uint_fastN_tกำหนดประเภทจำนวนเต็มที่ไม่ได้ลงชื่อที่เร็วที่สุดที่มีความกว้างอย่างน้อย N 3 ประเภทต่อไปนี้จำเป็นต้องใช้: int_fast8_t, int_fast16_t, int_fast32_t, int_fast64_t, uint_fast8_t, uint_fast16_t, uint_fast32_t,uint_fast64_t ประเภทอื่น ๆ ทั้งหมดของแบบฟอร์มนี้เป็นตัวเลือก 268)ประเภทที่กำหนดไม่รับประกันว่าจะเร็วที่สุดสำหรับทุกวัตถุประสงค์ หากการนำไปใช้ไม่มีเหตุผลที่ชัดเจนสำหรับการเลือกประเภทหนึ่งมากกว่าประเภทอื่นก็จะเลือกประเภทจำนวนเต็มบางอย่างที่ตอบสนองความต้องการของการลงนามและความกว้าง แต่ไม่ได้ระบุว่าทำไมประเภทจำนวนเต็ม "เร็ว" เหล่านี้จึงเร็วกว่า ทำไมจำนวนเต็มแบบเร็วเหล่านี้จึงเร็วกว่าประเภทจำนวนเต็มอื่น ๆ ผมติดแท็กคำถามกับ C ++ เพราะประเภทจำนวนเต็มอย่างรวดเร็วนอกจากนี้ยังมีใน C ++ 17 cstdintในไฟล์ส่วนหัวของ น่าเสียดายที่ใน …
107 c++  c  performance  types  int 

5
เหตุใดโค้ดที่กลายพันธุ์ของตัวแปรที่ใช้ร่วมกันระหว่างเธรดจึงไม่ได้รับผลกระทบจากสภาวะการแข่งขัน
ฉันใช้ Cygwin GCC และเรียกใช้รหัสนี้: #include <iostream> #include <thread> #include <vector> using namespace std; unsigned u = 0; void foo() { u++; } int main() { vector<thread> threads; for(int i = 0; i < 1000; i++) { threads.push_back (thread (foo)); } for (auto& t : threads) t.join(); cout << u << …

10
วิธีการไม่อนุญาตชั่วคราว
สำหรับคลาส Foo มีวิธีที่จะไม่อนุญาตให้สร้างโดยไม่ตั้งชื่อได้หรือไม่? ตัวอย่างเช่น: Foo("hi"); และอนุญาตเฉพาะในกรณีที่คุณตั้งชื่อดังต่อไปนี้? Foo my_foo("hi"); อายุการใช้งานของอันแรกเป็นเพียงคำสั่งและอันที่สองคือบล็อกปิดล้อม ในกรณีการใช้งานของฉันFooกำลังวัดเวลาระหว่างตัวสร้างและตัวทำลาย เนื่องจากฉันไม่เคยอ้างถึงตัวแปรภายในฉันจึงมักลืมใส่และเปลี่ยนอายุการใช้งานโดยไม่ได้ตั้งใจ ฉันต้องการรับข้อผิดพลาดเวลาคอมไพล์แทน
107 c++ 

10
C ++: ฉันควรใช้ไลบรารี regex อะไร [ปิด]
ปิด. คำถามนี้ไม่เป็นไปตามหลักเกณฑ์กองมากเกิน ขณะนี้ยังไม่ยอมรับคำตอบ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้เป็นหัวข้อสำหรับ Stack Overflow ปิดให้บริการใน5 ปีที่ผ่านมา ปรับปรุงคำถามนี้ ฉันกำลังทำงานกับโปรเจ็กต์ C ++ เชิงพาณิชย์ (ไม่ใช่โอเพ่นซอร์ส) ที่ทำงานบนระบบที่ใช้ลินุกซ์ ฉันต้องทำ regex ภายในโค้ด C ++ (ฉันรู้ว่าตอนนี้ฉันมีปัญหา 2 อย่าง) คำถาม: ไลบรารีใดที่ผู้ที่ใช้ regex จาก C / C ++ เป็นประจำแนะนำให้ฉันดู การค้นหาอย่างรวดเร็วทำให้ฉันสนใจสิ่งต่อไปนี้: 1) Boost.Regex (ฉันต้องไปอ่าน Boost Software License แต่คำถามนี้ไม่เกี่ยวกับลิขสิทธิ์ซอฟต์แวร์) 2) C (ไม่ใช่ C ++) POSIX regex (#include <regex.h>, …
107 c++  regex  linux 

4
การเปรียบเทียบ (python เทียบกับ c ++ โดยใช้ BLAS) และ (numpy)
ฉันต้องการเขียนโปรแกรมที่ใช้ประโยชน์จากฟังก์ชันพีชคณิตเชิงเส้น BLAS และ LAPACK อย่างกว้างขวาง เนื่องจากประสิทธิภาพเป็นปัญหาฉันจึงทำการเปรียบเทียบและอยากทราบว่าแนวทางที่ฉันทำนั้นถูกต้องหรือไม่ ฉันมีผู้เข้าแข่งขันสามคนและต้องการทดสอบประสิทธิภาพของพวกเขาด้วยการคูณเมทริกซ์ - เมทริกซ์อย่างง่าย ผู้เข้าแข่งขัน ได้แก่ Numpy ใช้เฉพาะฟังก์ชันของdot. Python เรียกฟังก์ชัน BLAS ผ่านวัตถุที่ใช้ร่วมกัน C ++ เรียกฟังก์ชัน BLAS ผ่านวัตถุที่ใช้ร่วมกัน สถานการณ์ ฉันใช้การคูณเมทริกซ์ - เมทริกซ์สำหรับมิติiต่างๆ iทำงานจาก 5 ถึง 500 โดยเพิ่มขึ้น 5 และเมทริกซ์m1และm2ตั้งค่าดังนี้: m1 = numpy.random.rand(i,i).astype(numpy.float32) m2 = numpy.random.rand(i,i).astype(numpy.float32) 1. เป็นก้อน รหัสที่ใช้มีลักษณะดังนี้: tNumpy = timeit.Timer("numpy.dot(m1, m2)", "import numpy; from __main__ …
107 c++  python  numpy  benchmarking  blas 

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


9
C ++ enums ลงนามหรือไม่ได้ลงนาม?
C ++ enums ลงนามหรือไม่ได้ลงนาม? และโดยส่วนขยายจะปลอดภัยหรือไม่ที่จะตรวจสอบอินพุตโดยตรวจสอบว่าเป็น <= ค่าสูงสุดของคุณและเว้นไว้> = ค่าขั้นต่ำของคุณ (สมมติว่าคุณเริ่มต้นที่ 0 และเพิ่มขึ้นทีละ 1)
107 c++  enums 

5
ข้อดีของ pass-by-value และ std :: move over pass-by-reference
ฉันกำลังเรียนรู้ C ++ ในขณะนี้และพยายามหลีกเลี่ยงนิสัยที่ไม่ดี จากสิ่งที่ฉันเข้าใจเสียงดังเป็นระเบียบมี "แนวทางปฏิบัติที่ดีที่สุด" มากมายและฉันพยายามยึดมั่นในแนวทางปฏิบัติเหล่านี้ให้ดีที่สุด (แม้ว่าฉันจะไม่เข้าใจว่าเหตุใดจึงถือว่าดี) แต่ฉันไม่แน่ใจว่า เข้าใจสิ่งที่แนะนำที่นี่ ฉันใช้คลาสนี้จากบทช่วยสอน: class Creature { private: std::string m_name; public: Creature(const std::string &name) : m_name{name} { } }; std::moveนี้นำไปสู่ข้อเสนอแนะจากเสียงดังกราว-เป็นระเบียบเรียบร้อยที่ฉันควรจะผ่านค่าแทนการอ้างอิงและการใช้งาน ถ้าเป็นเช่นนั้นฉันจะได้รับคำแนะนำให้ทำการnameอ้างอิง (เพื่อให้แน่ใจว่าจะไม่มีการคัดลอกทุกครั้ง) และคำเตือนที่std::moveจะไม่มีผลใด ๆ เพราะnameเป็นconstดังนั้นฉันจึงควรลบออก วิธีเดียวที่ฉันไม่ได้รับคำเตือนคือการลบconstทั้งหมด: Creature(std::string name) : m_name{std::move(name)} { } ซึ่งดูเหมือนจะเป็นตรรกะเนื่องจากประโยชน์เพียงอย่างเดียวconstคือการป้องกันไม่ให้ยุ่งกับสตริงเดิม (ซึ่งไม่ได้เกิดขึ้นเพราะฉันส่งผ่านค่า) แต่ฉันอ่านในCPlusPlus.com : แม้ว่าโปรดทราบว่า -in การย้ายไลบรารีมาตรฐานหมายความว่าอ็อบเจ็กต์ที่ย้ายจากถูกปล่อยให้อยู่ในสถานะที่ถูกต้อง แต่ไม่ได้ระบุ ซึ่งหมายความว่าหลังจากการดำเนินการดังกล่าวมูลค่าของวัตถุที่ย้ายจากควรถูกทำลายหรือกำหนดค่าใหม่เท่านั้น การเข้าถึงมิฉะนั้นจะให้ค่าที่ไม่ระบุ ลองนึกภาพรหัสนี้: …
107 c++ 

4
ฉันจะส่งผ่านวัตถุอย่างปลอดภัยโดยเฉพาะวัตถุ STL เข้าและออกจาก DLL ได้อย่างไร
ฉันจะส่งผ่านคลาสออบเจ็กต์โดยเฉพาะออบเจ็กต์ STL ไปยังและจาก C ++ DLL ได้อย่างไร แอปพลิเคชันของฉันต้องโต้ตอบกับปลั๊กอินของบุคคลที่สามในรูปแบบของไฟล์ DLL และฉันไม่สามารถควบคุมได้ว่าปลั๊กอินเหล่านี้สร้างขึ้นด้วยคอมไพเลอร์ใด ฉันทราบว่าไม่มี ABI ที่รับประกันสำหรับออบเจ็กต์ STL และฉันกังวลว่าจะทำให้แอปพลิเคชันของฉันไม่เสถียร
107 c++  windows  dll  stl  abi 

10
วิธีการเริ่มต้นตัวแปร const member ในคลาส?
#include <iostream> using namespace std; class T1 { const int t = 100; public: T1() { cout << "T1 constructor: " << t << endl; } }; เมื่อฉันพยายามเริ่มต้นตัวแปรสมาชิก const tด้วย 100 แต่มันทำให้ฉันมีข้อผิดพลาดต่อไปนี้: test.cpp:21: error: ISO C++ forbids initialization of member ‘t’ test.cpp:21: error: making ‘t’ static ฉันจะเริ่มต้นconstค่าได้อย่างไร
107 c++  const 

8
ข้อขัดข้อง "การเรียกฟังก์ชันเสมือนจริง" มาจากไหน
บางครั้งฉันสังเกตเห็นโปรแกรมที่ขัดข้องในคอมพิวเตอร์ของฉันโดยมีข้อผิดพลาด: "pure virtual function call" โปรแกรมเหล่านี้จะคอมไพล์ได้อย่างไรเมื่อวัตถุไม่สามารถสร้างคลาสนามธรรมได้

4
stringstream ทำอะไรได้บ้าง?
ฉันพยายามเรียนรู้ C ++ ตั้งแต่เมื่อวานและกำลังใช้เอกสารนี้: http://www.cplusplus.com/files/tutorial.pdf (หน้า 32) ฉันพบรหัสในเอกสารและฉันเรียกใช้ ฉันลองป้อน Rs 5.5 สำหรับราคาและจำนวนเต็มสำหรับปริมาณและผลลัพธ์เป็น 0 ฉันลองป้อน 5.5 และ 6 และเอาต์พุตถูกต้อง // stringstreams #include <iostream> #include <string> #include <sstream> using namespace std; int main () { string mystr; float price = 0; int quantity = 0; cout << "Enter price: "; getline (cin,mystr); …
107 c++  sstream 

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