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

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

2
การเปลี่ยนแปลงเกี่ยวกับชุดรูปแบบการสะกดคำแบบพิมพ์: การสร้างสิ่งเล็กน้อยในสถานที่
ฉันรู้ว่านี่เป็นเรื่องที่ค่อนข้างทั่วไป แต่เท่าที่ UB ทั่วไปหาได้ง่ายฉันไม่พบตัวแปรนี้จนถึงตอนนี้ ดังนั้นฉันจึงพยายามแนะนำวัตถุพิกเซลอย่างเป็นทางการในขณะที่หลีกเลี่ยงการคัดลอกข้อมูลจริง ถูกต้องหรือไม่ struct Pixel { uint8_t red; uint8_t green; uint8_t blue; uint8_t alpha; }; static_assert(std::is_trivial_v<Pixel>); Pixel* promote(std::byte* data, std::size_t count) { Pixel * const result = reinterpret_cast<Pixel*>(data); while (count-- > 0) { new (data) Pixel{ std::to_integer<uint8_t>(data[0]), std::to_integer<uint8_t>(data[1]), std::to_integer<uint8_t>(data[2]), std::to_integer<uint8_t>(data[3]) }; data += sizeof(Pixel); } return result; …

1
ใหม่ (นี่) ThisClass () เป็นความคิดที่ไม่ดีหรือไม่?
class FooView final : public Something { ... void refresh() { this->~FooView(); new (this) FooView(); } } ฉันไม่เคยเห็นสำนวนนี้และดูเหมือนว่ามันจะบอบบางและยุ่งเหยิงจริง ๆ แต่ฉันไม่สามารถคิดถึงปัญหากับมันFooViewได้ นี่เป็นความคิดที่ไม่ดีเหรอ?

1
การเปรียบเทียบ std :: string และสตริงตัวอักษรสไตล์ C
สมมติว่าฉันมีรหัสต่อไปนี้: #include <iostream> #include <string> #include <iomanip> using namespace std; // or std:: int main() { string s1{ "Apple" }; cout << boolalpha; cout << (s1 == "Apple") << endl; //true } คำถามของฉันคือ: ระบบตรวจสอบระหว่างสองสิ่งนี้อย่างไร s1เป็นวัตถุในขณะที่"Apple"เป็นตัวอักษรสตริงสไตล์ C เท่าที่ฉันรู้ชนิดข้อมูลที่แตกต่างไม่สามารถเปรียบเทียบได้ ฉันหายไปนี่อะไร

4
ซ่อนคลาสฐานที่ว่างเปล่าสำหรับการเริ่มต้นรวม
พิจารณารหัสต่อไปนี้: struct A { // No data members //... }; template<typename T, size_t N> struct B : A { T data[N]; } นี่คือวิธีที่คุณต้องเริ่มต้น B: B<int, 3> b = { {}, {1, 2, 3} }; ฉันต้องการหลีกเลี่ยงการว่าง {} ที่ไม่จำเป็นสำหรับคลาสฐาน มีวิธีแก้ปัญหาที่เสนอโดย Jarod42 ที่นี่แต่มันไม่ทำงานกับองค์ประกอบการเริ่มต้นองค์ประกอบ: B<int, 3> b = {1, 2, 3};ดี แต่B<int, 3> b …

1
ลำดับการดำเนินการของตัวดำเนินการใหม่และอาร์กิวเมนต์ของตัวสร้าง
ไม่ c ++ spec ระบุลำดับoperator newและคอนสตรัคของในA กรัม ++ ให้การสั่งซื้อจะ-> -> แต่เสียงดังกราว ++ ให้มันเป็น-> -> ความแตกต่างเกิดจากพฤติกรรมที่ไม่ระบุหรือไม่?new C(A())A()newC()newA()C() g ++: 7.4.0 clang ++: 10.0.0 #include <iostream> #include <cstdlib> struct A { A() { std::cout << "call A()\n"; } }; struct C { C(A) { std::cout << "call S()\n"; } void *operator new(size_t …

1
มันอนุญาตให้เพิ่มศูนย์เป็นตัวชี้โมฆะหรือไม่
ฉันรู้ว่าเลขคณิตตัวชี้นั้นไม่ได้รับอนุญาตสำหรับพอยน์เตอร์พอยน์เตอร์ แต่ลองนึกภาพฉันมีสิ่งนี้: class MyArray { int *arrayBegin; // pointer to the first array item, NULL for an empty array unsigned arraySize; // size of the array, zero for an empty array public: int *begin() const { return arrayBegin; } int *end() const { return arrayBegin + arraySize; } // possible? …

1
วิธีที่เหมาะสมในการคืนพอยน์เตอร์ไปยังวัตถุ“ ใหม่” จากฟังก์ชั่น Rcpp
ลองพิจารณา 1) คลาสที่กำหนดเองที่มีการพิมพ์หน่วยความจำขนาดใหญ่และ 2) ฟังก์ชั่นระดับสูงสุดที่ดำเนินการประมวลผลล่วงหน้าจากนั้นสร้างและส่งคืนออบเจ็กต์ใหม่ของคลาสที่กำหนดเองของเรา เพื่อหลีกเลี่ยงการคัดลอกโดยไม่จำเป็นค่าฟังก์ชั่นจัดสรรวัตถุและส่งกลับตัวชี้ไปที่มันแทน อยู่บนพื้นฐานของการอภิปรายก่อนหน้านี้Rcpp::XPtr<>ดูเหมือนว่าวิธีการที่เหมาะสมที่จะกลับตัวชี้ไปยังวัตถุที่สร้างขึ้นใหม่คือการห่อมันด้วย อย่างไรก็ตามจากนั้น R ก็เห็นว่าเป็นไปอย่างมีประสิทธิภาพexternalptrและฉันพยายามดิ้นรนเพื่อหาวิธีที่เหมาะสมในการคัดเลือกด้วยวิธีการที่ทันสมัยRCPP_EXPOSED_CLASSและRCPP_MODULEวิธีการทำสิ่งต่างๆ ทางเลือกคือการส่งคืนตัวชี้ดิบ แต่ฉันไม่แน่ใจ 100% ว่าหน่วยความจำวัตถุได้รับการล้างอย่างถูกต้อง ฉันวิ่งvalgrindไปทดสอบการรั่วไหลของหน่วยความจำ แต่ก็ไม่พบอะไรเลย อย่างไรก็ตามใครทำความสะอาด? R? test.cpp #include <Rcpp.h> // Custom class class Double { public: Double( double v ) : value(v) {} double square() {return value*value;} private: double value; }; // Make the class visible RCPP_EXPOSED_CLASS(Double) // …
9 c++  r  rcpp 

1
พยายามทำความเข้าใจแม่แบบและค้นหาชื่อ
ฉันพยายามเข้าใจตัวอย่างโค้ดต่อไปนี้ ตัวอย่าง # 1 template <typename T> struct A { static constexpr int VB = T::VD; }; struct B : A<B> { }; ไม่ว่าจะเป็น gcc9 หรือ clang9 ข้อผิดพลาดที่นี่ ถามทำไมรหัสนี้ถึงคอมไพล์? เราไม่ได้ยกตัวอย่างA<B>เมื่อได้รับมรดกจาก B? ไม่มี VD ใน B ดังนั้นคอมไพเลอร์ไม่ควรโยนข้อผิดพลาดที่นี่หรือ ตัวอย่าง # 2 template <typename T> struct A { static constexpr auto AB = …

1
MSVC เทียบเท่าสำหรับ -fno-char8_t คืออะไร
ใน C ++ 20 u8ตัวอักษรสตริงจะขึ้นอยู่กับchar8_tประเภท พวกเขาจงใจไม่แปลงเป็นchar const*อีกต่อไป: const char* str = u8"Hall\u00f6chen \u2603"; // no longer valid in C++20 แน่นอนว่าเป้าหมายสูงสุดเมื่อย้ายไปยัง C ++ 20 คือไปกับพฤติกรรมใหม่ทั้งหมด (ในตัวอย่างด้านบน: เปลี่ยนประเภทของstr) อย่างไรก็ตามเนื่องจากห้องสมุดของบุคคลที่สามจึงไม่สามารถทำได้ในทันที ข้อเสนอที่แนะนำและ"แก้ไข" char8_tคาดการณ์และกล่าวถึงในเสียงดังกราวและ gcc ว่ามีการ-fno-char8_tเปลี่ยนสถานะกลับเป็นพฤติกรรมเก่า (ในขณะที่ยังคงสามารถเพลิดเพลินกับคุณลักษณะ C ++ 20 อื่น ๆ ) ข้อเสนอที่ 2 ตั้งค่าความคาดหวังที่ Microsoft จะติดตามและเพิ่มการตั้งค่าสถานะที่คล้ายกัน แต่ฉันไม่สามารถค้นหาวิธีการตั้งค่าได้ (อย่างน้อยใน VS 2019 เวอร์ชัน 16.4) ดังนั้นใครจะรู้ว่าสิ่งที่เทียบเท่า …

1
std :: lock_guard จะเร็วกว่า std :: mutex :: lock () ได้อย่างไร?
ฉันโต้เถียงกับเพื่อนร่วมงานเกี่ยวกับ lock_guard และเขาเสนอว่า lock_guard นั้นน่าจะช้ากว่า mutex :: lock () / mutex :: unlock () เนื่องจากราคาของ instantiate และทำให้ชั้น lock_guard ลดลง จากนั้นฉันก็สร้างการทดสอบอย่างง่ายและแปลกใจรุ่นที่มี lock_guard นั้นเร็วกว่ารุ่นที่มี mutex :: lock () / mutex :: unlock () เกือบสองเท่า #include <iostream> #include <mutex> #include <chrono> std::mutex m; int g = 0; void func1() { m.lock(); g++; m.unlock(); …
9 c++  mutex 

1
จะป้องกันการแก้ไขข้อมูลอาเรย์ได้อย่างไร?
ว่าฉันมีชั้นเรียนที่มีลักษณะเช่นนี้ (นี่เป็นเพียงตัวอย่าง): class A { double *ptr; public: A() : ptr( new double[100] ) {} A( const A &other ) { other.ptr[7] = 15; } void doNotChangeMyData() const { ptr[43] = 14; } void changeMyData() { ptr[43] = 14; } ~A() { delete[] ptr; } }; constทั้งในตัวสร้างสำเนาและdoNotChangeMyDataฟังก์ชั่นให้มันเพื่อให้ptrไม่สามารถเปลี่ยนแปลงได้; ptrแต่นี้ยังช่วยให้ฉันเพื่อปรับเปลี่ยนเนื้อหาของอาร์เรย์ที่ชี้ไปตาม มีวิธีการป้องกันเนื้อหาของptrอาเรย์จากการเปลี่ยนแปลงในconstอินสแตนซ์เท่านั้นสั้น ๆ …
9 c++  const 

2
ฉันสามารถใช้ตัวจัดสรรที่กำหนดเองสำหรับ std :: array สำหรับคีย์การเข้ารหัสที่ปลอดภัยได้หรือไม่
ฉันรู้ว่าstd::arrayจัดสรรอย่างสมบูรณ์ในสแต็ก แต่คำถามนี้ได้รับแรงบันดาลใจจากความกังวลด้านความปลอดภัยที่ต้องการสองสิ่ง: ข้อมูลในstd::arrayจะถูก zerod หรือสุ่มเมื่อถูกทำลาย ข้อมูลในstd::arrayจะถูกล็อคเพื่อไม่ให้ไปที่ดิสก์ไม่ว่าจะเกิดข้อผิดพลาดหรือในหน่วยความจำสลับ มักจะมีstd::vectorวิธีการแก้ปัญหาคือการสร้างจัดสรรที่กำหนดเองที่ทำสิ่งเหล่านี้ อย่างไรก็ตามสำหรับstd::arrayฉันไม่เห็นวิธีการทำเช่นนี้และด้วยเหตุนี้คำถามนี้ สิ่งที่ดีที่สุดที่ฉันสามารถทำได้คือ: template <typename T, std::size_t Size> struct SecureArray : public std::array<T, Size> { static_assert(std::is_pod<T>::value, "Only POD types allowed") static_assert(sizeof(T) == 1, "Only 1-byte types allowed") virtual ~SecureArray() { std::vector<uint8_t> d = RandomBytes(Size); // generates Size random bytes std::memcpy(this->data(), d.data(), Size); } } …

4
จากภาษาธรรมชาติถึงการแสดงออก C ++
ที่ได้รับมอบหมาย: แปลนิพจน์ภาษาธรรมชาติต่อไปนี้เป็นนิพจน์ C ++ สมมติว่าตัวแปรทั้งหมดเป็นตัวเลขที่ไม่เป็นลบหรือบูลีน (ของค่าจริงหรือเท็จ) ภาษาธรรมชาติ: ทั้ง a และ b เป็นเท็จหรือ c เป็นจริง แต่ไม่ใช่ทั้งสองอย่าง ทางออกของฉัน: (a==0 && b==0)xor(c==1) อาจารย์แก้ปัญหา: (!a && !b) != c คำถาม: ฉันคิดว่าฉันเข้าใจวงเล็บแรกเล็กน้อยโดยพูดว่า "ไม่ใช่ -a" และ "ไม่ -b" ฉันคิดว่า a และ b ต้องผิดโดยให้ ab ถือว่าเป็นจุดเริ่มต้นที่ไม่ใช่ศูนย์ ขวา? แต่ส่วนที่บอกว่า "ไม่เท่ากันกับ c" ฉันไม่เข้าใจวิธีแก้ปัญหาของศาสตราจารย์ทุกคนสามารถทำลายมันให้ฉันได้หรือไม่? ขอขอบคุณสำหรับความช่วยเหลือ!
9 c++  logic 

1
“ เกิดขึ้นก่อนหน้านี้” หมายความว่าอะไร?
วลี "เกิดขึ้นอย่างแรงก่อน" ถูกใช้หลายครั้งในมาตรฐานฉบับร่าง C ++ ตัวอย่างเช่น: การยุติ [basic.start.term] / 5 หากความสมบูรณ์ของการเริ่มต้นของวัตถุที่มีระยะเวลาการจัดเก็บแบบคงที่เกิดขึ้นก่อนที่จะเรียก std :: atexit (ดู, [support.start.term]) การเรียกฟังก์ชั่นผ่านไปยัง std :: atexit ถูกจัดลำดับก่อนการเรียกไปยัง destructor สำหรับวัตถุ ถ้าการเรียกไปยัง std :: atexit เกิดขึ้นอย่างมากก่อนที่การเริ่มต้นของวัตถุที่มีระยะเวลาการจัดเก็บแบบสแตติกการเรียกไปยัง destructor สำหรับวัตถุนั้นจะถูกจัดลำดับก่อนที่การเรียกไปยังฟังก์ชันที่ส่งผ่านไปยัง std :: atexit . หากการเรียกไปยัง std :: atexit เกิดขึ้นอย่างยิ่งก่อนการเรียกไปยัง std :: atexit การเรียกใช้ฟังก์ชันที่ส่งไปยังการเรียก std :: atexit ที่สองจะถูกจัดลำดับก่อนการเรียกไปยังฟังก์ชันที่ส่งไปยัง first std :: …

1
ปลอดภัยหรือไม่ที่จะเรียกใช้พร้อมกัน :: concurrent_vector :: push_back ขณะที่วนซ้ำ concurrent_vector นั้นในเธรดอื่น?
push_back , เริ่มต้น , ปลายจะมีการอธิบายเป็นที่ปลอดภัยพร้อมกันใน https://docs.microsoft.com/en-us/cpp/parallel/concrt/reference/concurrent-vector-class?view=vs-2019#push_back อย่างไรก็ตามโค้ดด้านล่างนี้เป็นการยืนยัน อาจเป็นเพราะองค์ประกอบถูกเพิ่ม แต่ยังไม่ได้เริ่มต้น struct MyData { explicit MyData() { memset(arr, 0xA5, sizeof arr); } std::uint8_t arr[1024]; }; struct MyVec { concurrency::concurrent_vector<MyData> v; }; auto vector_pushback(MyVec &vec) -> void { vec.v.push_back(MyData{}); } auto vector_loop(MyVec &vec) -> void { MyData myData; for (auto it = vec.v.begin(); …

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