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

คำหลักในภาษาการเขียนโปรแกรมต่างๆที่มีไวยากรณ์คล้ายกับหรือมาจาก C (C ++, C #, Swift, Go, Rust, ฯลฯ ) ใช้แท็กภาษาการเขียนโปรแกรมเฉพาะเพื่อติดแท็กคำถามเกี่ยวกับการใช้ `struct 'เนื่องจากไวยากรณ์และซีแมนทิกส์นั้นขึ้นอยู่กับภาษา คำหลักกำหนดหรือประกาศประเภทข้อมูลที่ประกอบด้วยประเภทข้อมูลอื่น สมาชิกของโครงสร้างแต่ละคนมีพื้นที่หน่วยความจำของตัวเอง (ตรงข้ามกับ "สหภาพ" ซึ่งสมาชิกแบ่งปันพื้นที่หน่วยความจำเดียว)

4
ความต้องการของวงเล็บปีกกาว่างเปล่า '{}' ในตอนท้ายของอาร์เรย์ struct คืออะไร?
ฉันกดรหัสc ใน Linux kernel: static struct ctl_table ip_ct_sysctl_table[] = { { .procname = "ip_conntrack_max", .maxlen = sizeof(int), .mode = 0644, .proc_handler = proc_dointvec, }, // ... { .procname = "ip_conntrack_log_invalid", .maxlen = sizeof(unsigned int), .mode = 0644, .proc_handler = proc_dointvec_minmax, .extra1 = &log_invalid_proto_min, .extra2 = &log_invalid_proto_max, }, { } }; …

1
ความหมายของวัตถุที่ทับซ้อนกันใน C คืออะไร?
พิจารณาโครงสร้างต่อไปนี้: struct s { int a, b; }; โดยทั่วไป1 โครงสร้างนี้จะมีขนาด 8 และการจัดตำแหน่ง 4 จะเกิดอะไรขึ้นถ้าเราสร้างstruct sวัตถุสองชิ้น (แม่นยำยิ่งกว่านั้นเราเขียนลงในวัตถุสองหน่วยดังกล่าวที่จัดสรรแล้ว) โดยที่วัตถุที่สองซ้อนทับวัตถุแรก char *storage = malloc(3 * sizeof(struct s)); struct s *o1 = (struct s *)storage; // offset 0 struct s *o2 = (struct s *)(storage + alignof(struct s)); // offset 4 // now, o2 …

2
[[no_unique_address]] และสองค่าสมาชิกประเภทเดียวกัน
ฉันกำลังเล่นกับสิ่งต่อไปนี้[[no_unique_address]]ในc++20 ในตัวอย่างในcppreferenceเรามีประเภทEmptyและประเภทที่ว่างเปล่าZ struct Empty {}; // empty class struct Z { char c; [[no_unique_address]] Empty e1, e2; }; เห็นได้ชัดว่าขนาดของZต้องมีอย่างน้อย2เพราะประเภทe1และe2เหมือนกัน อย่างไรก็ตามฉันต้องการมีZขนาด1จริงๆ นี้มีฉันคิดสิ่งที่เกี่ยวกับการวางรูปภาพEmptyในชั้นเรียนเสื้อคลุมบางคนที่มีพารามิเตอร์แม่แบบพิเศษที่บังคับใช้ประเภทต่าง ๆและe1e2 template <typename T, int i> struct Wrapper : public T{}; struct Z1 { char c; [[no_unique_address]] Wrapper<Empty,1> e1; [[no_unique_address]] Wrapper<Empty,2> e2; }; น่าเสียดาย, sizeof(Z1)==2. มีเคล็ดลับในการทำให้ขนาดZ1เป็นที่หนึ่งหรือไม่? ฉันกำลังทดสอบสิ่งนี้ด้วยgcc version 9.2.1และclang …

6
วิธีเปรียบเทียบ struct ทั่วไปใน C ++?
ฉันต้องการเปรียบเทียบ structs ด้วยวิธีทั่วไปและฉันทำบางสิ่งเช่นนี้ (ฉันไม่สามารถแบ่งปันแหล่งที่มาจริงได้ดังนั้นขอรายละเอียดเพิ่มเติมหากจำเป็น): template<typename Data> bool structCmp(Data data1, Data data2) { void* dataStart1 = (std::uint8_t*)&data1; void* dataStart2 = (std::uint8_t*)&data2; return memcmp(dataStart1, dataStart2, sizeof(Data)) == 0; } ส่วนใหญ่ใช้งานได้ตามที่ตั้งใจยกเว้นบางครั้งมันจะคืนค่าเท็จแม้ว่าอินสแตนซ์ของ struct สองรายการมีสมาชิกเหมือนกัน หลังจากค้นหาบางฉันพบว่าmemcmpสามารถล้มเหลวเนื่องจากโครงสร้างที่ใช้เป็นเบาะ มีวิธีที่เหมาะสมกว่าในการเปรียบเทียบหน่วยความจำที่ไม่แยแสกับการขยายหรือไม่ ฉันไม่สามารถแก้ไข structs ที่ใช้ (พวกเขาเป็นส่วนหนึ่งของ API ที่ฉันใช้) และ structs ที่แตกต่างกันจำนวนมากที่ใช้มีสมาชิกที่แตกต่างกันและดังนั้นจึงไม่สามารถเปรียบเทียบเป็นรายบุคคลในแบบทั่วไป (กับความรู้ของฉัน) แก้ไข: ฉันโชคไม่ดีติดอยู่กับ C ++ 11 ควรพูดถึงเรื่องนี้ก่อนหน้านี้ ...
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.