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

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

3
ฉันไม่เข้าใจว่าทำไมการรวบรวมนี้
ฉันขาดอะไรบางอย่างไปแล้ว แต่ฉันไม่เข้าใจว่าทำไมการคอมไพล์นี้ (ทั้ง g ++ และ clang ++): struct A { }; struct B { }; int main() { A a(B); } ประการแรกBคือประเภท ... ไม่ใช่ค่า ฉันควรตีความรหัสนี้อย่างไร

8
การลบจำนวนเต็ม 8 บิตในจำนวนเต็ม 64- บิตโดย 1 ในแบบขนาน, SWAR โดยไม่มีฮาร์ดแวร์ SIMD
ถ้าฉันมีจำนวนเต็ม 64- บิตที่ฉันตีความเป็นอาร์เรย์ของจำนวนเต็ม 8 บิตที่บรรจุด้วย 8 องค์ประกอบ ฉันต้องลบค่าคงที่1จากจำนวนเต็มที่บรรจุแต่ละตัวขณะจัดการล้นโดยไม่มีผลลัพธ์ขององค์ประกอบหนึ่งที่มีผลต่อผลลัพธ์ขององค์ประกอบอื่น ฉันมีรหัสนี้ในขณะนี้และใช้งานได้ แต่ฉันต้องการวิธีแก้ปัญหาที่การลบของแต่ละจำนวนเต็ม 8 บิตบรรจุในแบบคู่ขนานและไม่ทำให้การเข้าถึงหน่วยความจำ ใน x86 ฉันสามารถใช้คำสั่ง SIMD เช่นpsubbนั้นลบจำนวนเต็ม 8 บิตพร้อมกัน แต่แพลตฟอร์มที่ฉันกำลังเข้ารหัสไม่รองรับคำแนะนำ SIMD (RISC-V ในกรณีนี้) ดังนั้นฉันจึงพยายามที่จะทำSWAR (SIMD ภายในการลงทะเบียน)เพื่อยกเลิกการเผยแพร่ด้วยตนเองระหว่างไบต์ของ a uint64_tทำสิ่งที่เทียบเท่ากับสิ่งนี้: uint64_t sub(uint64_t arg) { uint8_t* packed = (uint8_t*) &arg; for (size_t i = 0; i < sizeof(uint64_t); ++i) { packed[i] -= 1; …
77 c++  c  bit-manipulation  simd  swar 

7
ฉันสามารถใช้ NULL แทนค่า 0 ได้หรือไม่?
ฉันได้รับอนุญาตให้ใช้NULLตัวชี้แทนค่า0ใช่หรือไม่ หรือมีอะไรผิดปกติเกี่ยวกับการทำเช่นนั้น? ตัวอย่างเช่น: int i = NULL; เพื่อทดแทนสำหรับ: int i = 0; ในการทดลองฉันรวบรวมรหัสต่อไปนี้: #include <stdio.h> int main(void) { int i = NULL; printf("%d",i); return 0; } เอาท์พุท: 0 อันที่จริงมันทำให้ฉันเตือนนี้ซึ่งถูกต้องสมบูรณ์ด้วยตัวเอง: warning: initialization makes integer from pointer without a cast [-Wint-conversion] แต่ผลลัพธ์ยังคงเท่าเดิม ฉันกำลังเข้าสู่ "พฤติกรรมที่ไม่ได้กำหนด" กับสิ่งนี้หรือไม่? อนุญาตให้ใช้NULLในลักษณะนี้ได้ไหม มีอะไรผิดปกติNULLไหมในการใช้เป็นค่าตัวเลขในนิพจน์เชิงคณิตศาสตร์? และผลลัพธ์และพฤติกรรมใน C ++ สำหรับกรณีนี้คืออะไร ฉันได้อ่านคำตอบของอะไรคือความแตกต่างระหว่างโมฆะ …

10
ใช้ std :: vector เป็นมุมมองในหน่วยความจำดิบ
ฉันใช้ไลบรารี่ภายนอกซึ่งในบางครั้งจะให้ตัวชี้แบบดิบแก่อาร์เรย์ของจำนวนเต็มและขนาด ตอนนี้ฉันต้องการที่จะใช้std::vectorในการเข้าถึงและแก้ไขค่าเหล่านี้ในสถานที่แทนที่จะเข้าถึงพวกเขาด้วยตัวชี้แบบดิบ นี่คือตัวอย่าง articifial ที่อธิบายถึงจุด: size_t size = 0; int * data = get_data_from_library(size); // raw data from library {5,3,2,1,4}, size gets filled in std::vector<int> v = ????; // pseudo vector to be used to access the raw data std::sort(v.begin(), v.end()); // sort raw data in place for (int i …
71 c++  c++11  vector  stdvector 

3
โปรแกรมมัลติเธรดติดอยู่ในโหมดปรับให้เหมาะสม แต่จะทำงานตามปกติใน -O0
ฉันเขียนโปรแกรมหลายเธรดแบบง่าย ๆ ดังนี้: static bool finished = false; int func() { size_t i = 0; while (!finished) ++i; return i; } int main() { auto result=std::async(std::launch::async, func); std::this_thread::sleep_for(std::chrono::seconds(1)); finished=true; std::cout<<"result ="<<result.get(); std::cout<<"\nmain thread id="<<std::this_thread::get_id()<<std::endl; } มันทำงานตามปกติในโหมดดีบั๊กในVisual Studioหรือ-O0ในgc c และพิมพ์ผลหลังจากนั้นไม่1กี่วินาที แต่มันติดอยู่และไม่ได้พิมพ์อะไรในรีลีส-O1 -O2 -O3หรือโหมด

7
'ใหม่' และ 'ลบ' ได้รับการเลิกใช้ใน C ++ หรือไม่
ฉันพบคำถามที่เกี่ยวข้องกับการประกาศอาร์เรย์ที่มีขนาดต่างกัน สิ่งแรกที่อยู่ในใจของฉันคือฉันจะต้องใช้การจัดสรรแบบไดนามิกกับnewคำสั่งเช่นนี้ while(T--) { int N; cin >> N; int *array = new int[N]; // Do something with 'array' delete[] array; } อย่างไรก็ตามฉันเห็นว่าหนึ่งในวิธีแก้ปัญหาอนุญาตกรณีดังต่อไปนี้: while(T--) { int N; cin >> N; int array[N]; // Do something with 'array' } หลังจากการวิจัยเล็กน้อยฉันอ่านว่า g ++ อนุญาตให้ทำสิ่งนี้ได้ แต่มันทำให้ฉันนึกถึงซึ่งในกรณีนี้จำเป็นต้องใช้การจัดสรรแบบไดนามิกหรือไม่ หรือว่าคอมไพเลอร์แปลว่าเป็นการจัดสรรแบบไดนามิกหรือไม่ ฟังก์ชั่นลบรวมอยู่ด้วย อย่างไรก็ตามโปรดทราบว่าคำถามในที่นี้ไม่เกี่ยวกับการรั่วไหลของหน่วยความจำ

2
รหัสแม่แบบนี้จะทำให้ขนาดของอาร์เรย์ทำงานอย่างไร
ฉันสงสัยว่าทำไมรหัสประเภทนี้ถึงได้ขนาดของชุดทดสอบ? ฉันไม่คุ้นเคยกับไวยากรณ์ในแม่แบบ template<typename,size_t>อาจจะมีคนที่สามารถอธิบายความหมายของรหัสที่อยู่ภายใต้ นอกจากนี้ยังต้องการลิงค์อ้างอิงด้วยเช่นกัน #define dimof(array) (sizeof(DimofSizeHelper(array))) template <typename T, size_t N> char(&DimofSizeHelper(T(&array)[N]))[N]; void InitDynCalls() { char test[20]; size_t n = dimof(test); printf("%d", n); }
61 c++  visual-c++ 

10
โอเวอร์โฟลว์ที่มีการลงชื่อใน C ++ และพฤติกรรมที่ไม่ได้กำหนด (UB)
ฉันสงสัยเกี่ยวกับการใช้รหัสดังต่อไปนี้ int result = 0; int factor = 1; for (...) { result = ... factor *= 10; } return result; หากวนซ้ำซ้ำหลายnครั้งfactorจะถูกคูณด้วยจำนวนเวลาที่10แน่นอน nอย่างไรก็ตามfactorมีการใช้งานเฉพาะหลังจากที่ถูกคูณด้วย10จำนวนn-1ครั้งทั้งหมด หากเราสมมติว่าfactorไม่มีการโอเวอร์โฟลว์ยกเว้นในการวนซ้ำครั้งสุดท้ายของลูป แต่อาจโอเวอร์โฟลว์ในการวนซ้ำครั้งสุดท้ายของลูปรหัสนั้นควรยอมรับได้หรือไม่ ในกรณีนี้ค่าของfactorจะไม่ถูกใช้อย่างแน่นอนหลังจากเกิดการล้น ฉันกำลังถกเถียงกันว่าควรยอมรับรหัสเช่นนี้หรือไม่ มันจะเป็นไปได้ที่จะนำการคูณเข้ามาในคำสั่ง if และเพียงแค่ไม่ทำการคูณในการวนซ้ำครั้งสุดท้ายของลูปเมื่อมันสามารถล้น ข้อเสียคือมัน clutters รหัสและเพิ่มสาขาที่ไม่จำเป็นที่จะต้องตรวจสอบในการวนซ้ำก่อนหน้านี้ทั้งหมด ฉันยังสามารถวนซ้ำวนซ้ำในเวลาที่น้อยลงและทำซ้ำลูปบอดี้อีกครั้งหลังจากวนซ้ำอีกครั้งนี่ทำให้โค้ดซับซ้อน มีการใช้รหัสจริงในวงในที่แน่นหนาซึ่งใช้เวลาในการประมวลผลของ CPU ทั้งหมดในแอปพลิเคชันกราฟิกแบบเรียลไทม์

5
วิธีรับแอดเดรสของฟังก์ชันแลมบ์ดา C ++ ภายในแลมบ์ดาเองได้อย่างไร
ฉันกำลังพยายามหาวิธีรับที่อยู่ของฟังก์ชันแลมบ์ดาภายในตัวเอง นี่คือตัวอย่างรหัส: []() { std::cout << "Address of this lambda function is => " << ???? }(); ฉันรู้ว่าฉันสามารถจับแลมบ์ดาในตัวแปรและพิมพ์ที่อยู่ได้ แต่ฉันต้องการทำสิ่งนี้เมื่อฟังก์ชันที่ไม่ระบุตัวตนกำลังดำเนินการ มีวิธีที่ง่ายกว่านี้หรือไม่?
53 c++  c++11  lambda  c++14  c++17 

3
ตัวดำเนินการความเท่าเทียมกันไม่ได้ถูกกำหนดไว้สำหรับการใช้งานยานอวกาศที่กำหนดเองใน C ++ 20
ฉันพบพฤติกรรมแปลก ๆ กับผู้ประกอบการยานอวกาศใหม่<=>ใน C ++ 20 ฉันใช้ Visual Studio 2019 /std:c++latestกับคอมไพเลอร์ รหัสนี้คอมไพล์ได้ดีตามที่คาดไว้: #include <compare> struct X { int Dummy = 0; auto operator<=>(const X&) const = default; // Default implementation }; int main() { X a, b; a == b; // OK! return 0; } อย่างไรก็ตามหากฉันเปลี่ยนXเป็นสิ่งนี้: struct X { int …

3
เริ่มต้นสมาชิกคลาสคงที่หลายคนโดยใช้การเรียกฟังก์ชันหนึ่ง C ++
หากฉันมีตัวแปรสมาชิกคงที่แตกต่างกันสองตัวซึ่งทั้งสองต้องเริ่มต้นใหม่โดยใช้การเรียกฟังก์ชันเดียวกันมีวิธีการทำเช่นนี้โดยไม่ต้องเรียกใช้ฟังก์ชันสองครั้งหรือไม่ ตัวอย่างเช่นคลาสเศษส่วนที่ตัวเศษและตัวหารเป็นค่าคงที่ int gcd(int a, int b); // Greatest Common Divisor class Fraction { public: // Lets say we want to initialize to a reduced fraction Fraction(int a, int b) : numerator(a/gcd(a,b)), denominator(b/gcd(a,b)) { } private: const int numerator, denominator; }; ส่งผลให้เสียเวลาเนื่องจากฟังก์ชั่น GCD ถูกเรียกสองครั้ง คุณสามารถกำหนดสมาชิกคลาสใหม่gcd_a_bและก่อนกำหนดเอาต์พุตของ gcd ให้กับรายการนั้นในรายการ initializer แต่สิ่งนี้จะนำไปสู่การสูญเสียความจำ โดยทั่วไปแล้วมีวิธีการทำเช่นนี้โดยไม่ต้องใช้ฟังก์ชั่นการโทรหรือหน่วยความจำที่สูญเปล่า …

5
แม่แบบสตริงที่เป็นมิตรกับตัวเลขใน C ++
ในไลบรารีมาตรฐาน C ++ มีฟังก์ชั่นการแปลงจากสตริงเป็นชนิดตัวเลข: stoi stol stoll stoul stoull stof stod stold แต่ฉันคิดว่ามันน่าเบื่อที่จะใช้มันในเทมเพลตโค้ด เหตุใดจึงไม่มีเทมเพลตทำหน้าที่คล้าย: template<typename T> T sto(...) แปลงสตริงเป็นชนิดตัวเลขได้อย่างไร ฉันไม่เห็นเหตุผลทางเทคนิคใด ๆ ที่จะไม่มี แต่อาจมีบางอย่างที่ขาดหายไป พวกเขาสามารถเป็นพิเศษในการเรียกฟังก์ชั่นที่มีชื่อพื้นฐานและใช้enable_if/ conceptsเพื่อปิดการใช้งานที่ไม่ใช่ตัวเลข มีทางเลือกที่เป็นมิตรกับแม่แบบในไลบรารีมาตรฐานเพื่อแปลงสตริงเป็นชนิดตัวเลขและวิธีอื่น ๆ อย่างมีประสิทธิภาพหรือไม่?

2
ทำไม“ ใช้ระบบ” ไม่ถือว่าเป็นการปฏิบัติที่ไม่ดี?
ฉันมีพื้นหลัง C ++ และฉันเข้าใจและเห็นด้วยอย่างยิ่งกับคำตอบของคำถามนี้: เหตุใด“ ใช้ namespace std;” ถือว่าเป็นการปฏิบัติที่ไม่ดี? ดังนั้นฉันประหลาดใจที่มีประสบการณ์กับ C # ตอนนี้ฉันเห็นตรงข้ามแน่นอน: using Some.Namespace;มีการใช้อักษรทุกที่ เมื่อใดก็ตามที่คุณเริ่มใช้ประเภทคุณเพิ่มคำสั่งที่ใช้สำหรับเนมสเปซก่อน (ถ้ายังไม่มีอยู่) ฉันไม่สามารถจำได้เห็น.csแฟ้ม: using System; using System.Collections.Generic; using X.Y.Z; etc...ที่ไม่ได้เริ่มต้นด้วย ในความเป็นจริงถ้าคุณเพิ่มไฟล์ใหม่ผ่านวิซาร์ด Visual Studio มันจะเพิ่มไฟล์บางไฟล์โดยใช้คำสั่งที่นั่นแม้ว่าคุณอาจไม่ต้องการมันก็ตาม ดังนั้นในขณะที่ในชุมชน C ++ คุณจะได้รับการลงโทษโดยทั่วไป C # ก็สนับสนุนให้ทำเช่นนี้ อย่างน้อยนี่คือสิ่งที่ฉันเห็น ตอนนี้ฉันเข้าใจแล้วว่าการใช้คำสั่งใน C # และ C ++ ไม่ใช่สิ่งเดียวกัน นอกจากนี้ฉันจะเข้าใจว่าหนึ่งในสิ่ง nastiest ที่คุณสามารถทำอะไรกับusing namespaceใน C ++ …

2
อัลกอริทึมเพื่อค้นหาวิธีแก้ปัญหาสำหรับ A xor X = B + X
รับจำนวนเต็ม A และ B หาจำนวนเต็ม X เพื่อที่: A, B <2 * 1e18 A xor X = B + X ฉันสงสัยอย่างมากว่ามันเป็นไปได้ที่จะแก้สมการนี้โดยใช้คณิตศาสตร์ นี่เป็นปัญหาการเข้ารหัสที่ฉันเจอเมื่อ 3 ปีที่แล้วและตอนนี้ฉันก็ยังแก้ไม่ได้ด้วยตัวเอง รหัสของฉันจนถึงตอนนี้: (นี่คือการแก้ปัญหากำลังดุร้าย) #include <iostream> using namespace std; int main() { unsigned long long a, b; cin >> a >> b; for (unsigned long long x = 1; …
46 c++  xor 

3
std :: vector (ab) ใช้ที่เก็บข้อมูลอัตโนมัติ
พิจารณาตัวอย่างต่อไปนี้: #include <array> int main() { using huge_type = std::array<char, 20*1024*1024>; huge_type t; } เห็นได้ชัดว่ามันจะผิดพลาดในแพลตฟอร์มส่วนใหญ่เนื่องจากขนาดสแต็คเริ่มต้นมักจะน้อยกว่า 20MB พิจารณารหัสต่อไปนี้: #include <array> #include <vector> int main() { using huge_type = std::array<char, 20*1024*1024>; std::vector<huge_type> v(1); } น่าแปลกที่มันเกิดปัญหาเช่นกัน! การย้อนกลับ (ด้วยหนึ่งในเวอร์ชันล่าสุดของ libstdc ++) นำไปสู่include/bits/stl_uninitialized.hไฟล์ซึ่งเราสามารถเห็นบรรทัดต่อไปนี้: typedef typename iterator_traits<_ForwardIterator>::value_type _ValueType; std::fill(__first, __last, _ValueType()); ตัวvectorสร้างปรับขนาดต้องเริ่มต้นองค์ประกอบและนี่คือวิธีการใช้งาน เห็นได้ชัดว่า_ValueType()ชั่วคราวเกิดปัญหาสแต็ก คำถามคือการใช้งานที่สอดคล้องหรือไม่ ถ้าใช่จริง ๆ …

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