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

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

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

16
ตรวจสอบว่าคลาสมีฟังก์ชันสมาชิกของลายเซ็นที่กำหนดหรือไม่
ฉันกำลังขอเคล็ดลับเทมเพลตเพื่อตรวจสอบว่าชั้นเรียนมีฟังก์ชันสมาชิกเฉพาะของลายเซ็นที่กำหนดหรือไม่ ปัญหาคล้ายกับที่อ้างถึงที่นี่ http://www.gotw.ca/gotw/071.htm แต่ไม่เหมือนกัน: ในรายการหนังสือของซัตเทอร์เขาตอบคำถามที่คลาส C ต้องให้ฟังก์ชันสมาชิกด้วย ลายเซ็นเฉพาะมิฉะนั้นโปรแกรมจะไม่รวบรวม ในปัญหาของฉันฉันต้องทำอะไรบางอย่างถ้าคลาสมีฟังก์ชันนั้นให้ทำ "อย่างอื่น" ประสบปัญหาที่คล้ายกันโดย boost :: serialization แต่ฉันไม่ชอบวิธีแก้ปัญหาที่พวกเขานำมาใช้: ฟังก์ชันเทมเพลตที่เรียกใช้ฟังก์ชันฟรี (ที่คุณต้องกำหนด) โดยค่าเริ่มต้นด้วยลายเซ็นเฉพาะเว้นแต่คุณจะกำหนดฟังก์ชันสมาชิกเฉพาะ ( ในกรณีของพวกเขา "ทำให้เป็นอนุกรม" ที่ใช้พารามิเตอร์ 2 ตัวในประเภทที่กำหนด) โดยมีลายเซ็นเฉพาะมิฉะนั้นข้อผิดพลาดในการคอมไพล์จะเกิดขึ้น นั่นคือการใช้การทำให้เป็นอนุกรมทั้งแบบล่วงล้ำและไม่ล่วงล้ำ ฉันไม่ชอบวิธีแก้ปัญหานั้นด้วยเหตุผลสองประการ: เพื่อไม่ล่วงล้ำคุณต้องแทนที่ฟังก์ชัน "serialize" ทั่วโลกที่อยู่ใน boost :: serialization namespace ดังนั้นคุณจึงมีรหัสลูกค้าของคุณเพื่อเปิดการเพิ่มเนมสเปซและการทำให้เป็นอนุกรมเนมสเปซ! สแต็กเพื่อแก้ไขปัญหานั้นคือการเรียกใช้ฟังก์ชัน 10 ถึง 12 ฉันต้องการกำหนดพฤติกรรมที่กำหนดเองสำหรับคลาสที่ไม่มีฟังก์ชันสมาชิกนั้นและเอนทิตีของฉันอยู่ภายในเนมสเปซที่แตกต่างกัน (และฉันไม่ต้องการแทนที่ฟังก์ชันส่วนกลางที่กำหนดไว้ในเนมสเปซเดียวในขณะที่ฉันอยู่ในอีกอันหนึ่ง) คุณช่วยไขปริศนานี้ให้ฉันได้ไหม
135 c++  c++11  templates  sfinae 

6
วิธีรับการประทับเวลาปัจจุบันในหน่วยมิลลิวินาทีตั้งแต่ปี 1970 ตามที่ Java ได้รับ
ใน Java เราสามารถใช้System.currentTimeMillis()เพื่อรับการประทับเวลาปัจจุบันในหน่วยมิลลิวินาทีนับตั้งแต่เวลาซึ่งก็คือ - ความแตกต่างวัดเป็นมิลลิวินาทีระหว่างเวลาปัจจุบันถึงเที่ยงคืนวันที่ 1 มกราคม 1970 UTC ใน C ++ จะได้สิ่งเดียวกันได้อย่างไร? ตอนนี้ฉันกำลังใช้สิ่งนี้เพื่อรับการประทับเวลาปัจจุบัน - struct timeval tp; gettimeofday(&tp, NULL); long int ms = tp.tv_sec * 1000 + tp.tv_usec / 1000; //get current timestamp in milliseconds cout << ms << endl; หน้าตาแบบนี้ใช่หรือไม่?
135 c++  timestamp 

22
การทดสอบหน่วยสำหรับรหัส C ++ - เครื่องมือและระเบียบวิธี [ปิด]
ปิด. คำถามนี้ไม่เป็นไปตามหลักเกณฑ์กองมากเกิน ขณะนี้ยังไม่ยอมรับคำตอบ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้เป็นหัวข้อสำหรับ Stack Overflow ปิดให้บริการใน4 ปีที่แล้ว ปรับปรุงคำถามนี้ ฉันกำลังทำงานกับระบบ c ++ ขนาดใหญ่ที่อยู่ระหว่างการพัฒนามาสองสามปีแล้ว ในฐานะที่เป็นส่วนหนึ่งของความพยายามในการปรับปรุงคุณภาพของโค้ดที่มีอยู่เราจึงมีส่วนร่วมในโครงการปรับโครงสร้างระยะยาวขนาดใหญ่ คุณรู้จักเครื่องมือที่ดีที่สามารถช่วยฉันเขียนการทดสอบหน่วยใน C ++ ได้หรือไม่? อาจจะคล้ายกับ Junit หรือ Nunit? ใครสามารถให้คำแนะนำที่ดีเกี่ยวกับวิธีการเขียนการทดสอบหน่วยสำหรับโมดูลที่เขียนโดยไม่คำนึงถึงการทดสอบหน่วย

3
จะเกิดอะไรขึ้นถ้าคุณเรียกลบ () บนองค์ประกอบแผนที่ในขณะที่ทำซ้ำตั้งแต่ต้นจนจบ
ในรหัสต่อไปนี้ฉันวนลูปผ่านแผนที่และทดสอบว่าจำเป็นต้องลบองค์ประกอบหรือไม่ ปลอดภัยหรือไม่ที่จะลบองค์ประกอบและทำซ้ำต่อไปหรือฉันต้องรวบรวมคีย์ในคอนเทนเนอร์อื่นและทำลูปที่สองเพื่อเรียกการลบ () map<string, SerialdMsg::SerialFunction_t>::iterator pm_it; for (pm_it = port_map.begin(); pm_it != port_map.end(); pm_it++) { if (pm_it->second == delete_this_id) { port_map.erase(pm_it->first); } } UPDATE: แน่นอนจากนั้นฉันก็อ่านคำถามนี้ซึ่งฉันไม่คิดว่าจะเกี่ยวข้อง แต่ตอบคำถามของฉัน
134 c++  stl  iterator 

3
วิธีการพิมพ์ uint64_t? ล้มเหลวกับ: "ต่อท้ายปลอม"% "ในรูปแบบ"
ฉันเขียนรหัสทดสอบที่ง่ายมากของ printf uint64_t: #include <inttypes.h> #include <stdio.h> int main() { uint64_t ui64 = 90; printf("test uint64_t : %" PRIu64 "\n", ui64); return 0; } ฉันใช้ ubuntu 11.10 (64 บิต) และ gcc เวอร์ชัน 4.6.1 เพื่อคอมไพล์ แต่ล้มเหลว: main.cpp: In function ‘int main()’: main.cpp:9:30: error: expected ‘)’ before ‘PRIu64’ main.cpp:9:47: warning: spurious trailing …
134 c++  c 

20
ปลอดภัยไหมที่จะใช้ -1 เพื่อตั้งค่าบิตทั้งหมดให้เป็นจริง
ฉันเคยเห็นรูปแบบนี้ใช้มากใน C & C ++ unsigned int flags = -1; // all bits are true นี่เป็นวิธีพกพาที่ดีในการทำสิ่งนี้หรือไม่? หรือใช้อยู่0xffffffffหรือ~0ดีกว่า?
134 c++  c  binary  bit-fields 

17
เธรดของ Windows: _beginthread vs _beginthreadex vs CreateThread C ++
สิ่งที่เป็นวิธีที่ดีกว่าที่จะเริ่มต้นด้าย_beginthread, _beginthreadxหรือCreateThread? ฉันพยายามที่จะตรวจสอบสิ่งที่เป็นข้อดี / ข้อเสียของ_beginthread, และ_beginthreadex CreateThreadฟังก์ชั่นทั้งหมดนี้ส่งคืนตัวจัดการเธรดไปยังเธรดที่สร้างขึ้นใหม่ฉันรู้อยู่แล้วว่า CreateThread ให้ข้อมูลเพิ่มเติมเล็กน้อยเมื่อเกิดข้อผิดพลาด (สามารถตรวจสอบได้โดยการโทรGetLastError) ... แต่มีสิ่งใดบ้างที่ฉันควรพิจารณาเมื่อฉัน m โดยใช้ฟังก์ชันเหล่านี้หรือไม่ ฉันกำลังทำงานกับแอปพลิเคชัน windows ดังนั้นความเข้ากันได้ข้ามแพลตฟอร์มจึงไม่เป็นปัญหา ฉันได้อ่านเอกสาร msdn แล้วและฉันก็ไม่เข้าใจเช่นทำไมใคร ๆ ถึงตัดสินใจใช้ _beginthread แทน CreateThread หรือในทางกลับกัน ไชโย! อัปเดต: โอเคขอบคุณสำหรับข้อมูลทั้งหมดฉันได้อ่านในสถานที่สองสามแห่งที่ฉันไม่สามารถโทรหาได้WaitForSingleObject()หากฉันใช้_beginthread()แต่ถ้าฉันโทร_endthread()ในเธรดจะไม่ได้ผล? มีข้อตกลงอะไรบ้าง?
134 c++  c  multithreading  winapi 


3
ความแตกต่างระหว่าง include_directories และ target_include_directories ใน CMake คืออะไร?
ฉันมีโครงสร้างไดเร็กทอรีสำหรับรหัส C ++ ของฉันซึ่งจะเป็นดังนี้: | |->include |->src ฉันกำลังเขียนไฟล์ CMakeLists.txt สำหรับรหัสของฉัน ฉันต้องการที่จะเข้าใจความแตกต่างระหว่างinclude_directoriesและในtarget_include_directoriesCMake อะไรคือความแตกต่างระหว่างการใช้งานและเพื่อเพิ่มเส้นทางไฟล์รวมของฉันฉันควรใช้อันไหน
134 c++  cmake 

12
การพิมพ์จำนวนทศนิยมที่ถูกต้องด้วย cout
ฉันมีรายการfloatค่าและฉันต้องการพิมพ์coutด้วยทศนิยม 2 ตำแหน่ง ตัวอย่างเช่น: 10.900 should be printed as 10.90 1.000 should be printed as 1.00 122.345 should be printed as 122.34 ฉันจะทำสิ่งนี้ได้อย่างไร ( setprecisionดูเหมือนจะไม่ช่วยในเรื่องนี้)
133 c++ 

4
วิธีหนึ่งควรใช้ std :: ไม่จำเป็น?
ฉันอ่านเอกสารของstd::experimental::optionalและฉันมีความคิดที่ดีเกี่ยวกับสิ่งที่มันทำ แต่ฉันไม่เข้าใจเมื่อฉันควรใช้หรือวิธีที่ฉันควรใช้ ไซต์ยังไม่มีตัวอย่างใด ๆ ซึ่งทำให้ฉันเข้าใจแนวคิดที่แท้จริงของวัตถุนี้ได้ยากขึ้น เมื่อใดจึงstd::optionalเป็นทางเลือกที่ดีในการใช้งานและจะชดเชยสิ่งที่ไม่พบในมาตรฐานก่อนหน้านี้ (C ++ 11) ได้อย่างไร

13
การเพิ่มประสิทธิภาพใด ๆ สำหรับการเข้าถึงแบบสุ่มในอาร์เรย์ขนาดใหญ่มากเมื่อค่าใน 95% ของเคสเป็น 0 หรือ 1?
มีการเพิ่มประสิทธิภาพที่เป็นไปได้สำหรับการเข้าถึงแบบสุ่มในอาร์เรย์ขนาดใหญ่มากหรือไม่ (ปัจจุบันฉันใช้uint8_tและกำลังถามว่ามีอะไรดีกว่า) uint8_t MyArray[10000000]; เมื่อค่าที่ตำแหน่งใด ๆ ในอาร์เรย์คือ 0หรือ1สำหรับ95%ของทุกกรณี 2ใน4%ของกรณี ระหว่าง3ถึง255ในอีก1%ของกรณี? มีอะไรดีไปกว่าuint8_tอาร์เรย์ที่จะใช้สำหรับสิ่งนี้หรือไม่? ควรเร็วที่สุดเท่าที่จะเป็นไปได้ในการวนซ้ำอาร์เรย์ทั้งหมดตามลำดับแบบสุ่มและนี่หนักมากกับแบนด์วิดท์ RAM ดังนั้นเมื่อมีเธรดมากกว่าสองสามเธรดที่ทำเช่นนั้นในเวลาเดียวกันสำหรับอาร์เรย์ที่แตกต่างกันปัจจุบันแบนด์วิดท์ RAM ทั้งหมด อิ่มตัวอย่างรวดเร็ว ฉันถามเนื่องจากรู้สึกว่าไม่มีประสิทธิภาพมากที่จะมีอาร์เรย์ขนาดใหญ่ (10 MB) เมื่อทราบว่าค่าเกือบทั้งหมดนอกเหนือจาก 5% จะเป็น 0 หรือ 1 ดังนั้นเมื่อ 95% ของค่าทั้งหมดในอาร์เรย์ ต้องการเพียง 1 บิตแทนที่จะเป็น 8 บิตซึ่งจะลดการใช้หน่วยความจำลงเกือบจะเป็นลำดับความสำคัญ รู้สึกว่าจะต้องมีโซลูชันที่มีประสิทธิภาพหน่วยความจำมากกว่าซึ่งจะช่วยลดแบนด์วิดท์ RAM ที่จำเป็นสำหรับสิ่งนี้ได้อย่างมากและเป็นผลให้การเข้าถึงแบบสุ่มเร็วขึ้นอย่างมาก

8
D เมื่อเทียบกับ C ++ เร็วแค่ไหน?
ฉันชอบคุณสมบัติบางอย่างของ D แต่จะสนใจว่ามันมาพร้อมกับการลงโทษรันไทม์หรือไม่? เพื่อเปรียบเทียบฉันใช้โปรแกรมง่ายๆที่คำนวณผลิตภัณฑ์สเกลาร์ของเวกเตอร์สั้น ๆ จำนวนมากทั้งใน C ++ และใน D ผลลัพธ์ที่ได้นั้นน่าประหลาดใจ: D: 18.9 วินาที [ดูด้านล่างสำหรับรันไทม์สุดท้าย] C ++: 3.8 วิ C ++ เร็วกว่าเกือบห้าเท่าจริง ๆ หรือว่าฉันทำผิดพลาดในโปรแกรม D? ฉันรวบรวม C ++ ด้วย g ++ -O3 (gcc-snapshot 2011-02-19) และ D พร้อม dmd -O (dmd 2.052) บนเดสก์ท็อป linux ในระดับปานกลาง ผลลัพธ์สามารถทำซ้ำได้ในการวิ่งหลายครั้งและค่าเบี่ยงเบนมาตรฐานเล็กน้อย ที่นี่โปรแกรม C ++: #include <iostream> …
133 c++  performance  runtime  d 

10
เหตุใดคอมไพเลอร์ C และ C ++ จึงอนุญาตให้มีความยาวอาร์เรย์ในลายเซ็นของฟังก์ชันเมื่อไม่เคยบังคับใช้
นี่คือสิ่งที่ฉันพบในช่วงการเรียนรู้ของฉัน: #include<iostream> using namespace std; int dis(char a[1]) { int length = strlen(a); char c = a[2]; return length; } int main() { char b[4] = "abc"; int c = dis(b); cout << c; return 0; } ดังนั้นในตัวแปรint dis(char a[1])ที่[1]ดูเหมือนว่าจะทำอะไรและไม่ทำงานทั้งหมดเพราะฉันสามารถใช้ a[2]เช่นเดียวกับint a[]หรือchar *a. ฉันรู้ว่าชื่ออาร์เรย์เป็นตัวชี้และวิธีการถ่ายทอดอาร์เรย์ดังนั้นปริศนาของฉันจึงไม่เกี่ยวกับส่วนนี้ สิ่งที่ฉันอยากรู้คือทำไมคอมไพเลอร์ถึงยอมให้มีพฤติกรรมนี้ ( int a[1]) หรือมันมีความหมายอื่นที่ฉันไม่รู้?
133 c++  c  arrays 

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