คำถามติดแท็ก object-lifetime

2
นี่เป็นข้อบกพร่องของคอมไพเลอร์ C # หรือไม่?
ฉันกำลังตอบคำถามเกี่ยวกับความเป็นไปได้ของการปิด (อย่างถูกกฎหมาย) การยืดอายุการใช้งานของวัตถุเมื่อฉันพบโค้ดโคเจนที่แปลกประหลาดมากในส่วนของคอมไพเลอร์ C # (4.0 ถ้าสำคัญ) repro ที่สั้นที่สุดที่ฉันสามารถค้นหาได้มีดังต่อไปนี้: สร้างแลมบ์ดาที่จับภาพท้องถิ่นในขณะที่เรียกใช้ วิธีการคงที่ของประเภทที่มี กำหนดผู้รับมอบสิทธิ์อ้างอิงสร้างฟิลด์อินสแตนซ์ของวัตถุที่ประกอบด้วย ผลลัพธ์: คอมไพเลอร์สร้างการปิดวัตถุที่อ้างอิงวัตถุที่สร้างแลมบ์ดาเมื่อไม่มีเหตุผล - เป้าหมาย 'ภายใน' ของผู้รับมอบสิทธิ์เป็นวิธีการคงที่และสมาชิกอินสแตนซ์ของแลมบ์ด้าการสร้างวัตถุไม่จำเป็น ถูก (และไม่) แตะเมื่อผู้รับมอบสิทธิ์ถูกดำเนินการ คอมไพเลอร์ทำหน้าที่เหมือนโปรแกรมเมอร์ที่จับได้thisโดยไม่มีเหตุผล class Foo { private Action _field; public void InstanceMethod() { var capturedVariable = Math.Pow(42, 1); _field = () => StaticMethod(capturedVariable); } private static void StaticMethod(double arg) { } …

3
มันโอเคที่จะส่งคืนค่าอาร์กิวเมนต์เริ่มต้นโดยการอ้างอิง const หรือไม่
มันโอเคที่จะส่งคืนค่าอาร์กิวเมนต์เริ่มต้นโดยการอ้างอิง const เช่นในตัวอย่างด้านล่าง: https://coliru.stacked-crooked.com/a/ff76e060a007723b #include <string> const std::string& foo(const std::string& s = std::string("")) { return s; } int main() { const std::string& s1 = foo(); std::string s2 = foo(); const std::string& s3 = foo("s"); std::string s4 = foo("s"); }

3
ค่าของตัวชี้ `นี่ 'คงที่ในช่วงชีวิตของวัตถุหรือไม่?
ค่าของthisตัวชี้รับประกันเป็นค่าคงที่ในช่วงชีวิตของวัตถุเฉพาะหรือไม่? ฉันไม่สามารถจินตนาการถึงกรณีที่มันจะเปลี่ยน แต่ไม่ทราบว่าฉันไม่ได้หายไปบางสิ่งบางอย่าง

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