คำถามติดแท็ก memory-alignment

8
วัตถุประสงค์ของการจัดตำแหน่งหน่วยความจำ
เป็นที่ยอมรับฉันไม่ได้รับมัน สมมติว่าคุณมีหน่วยความจำที่มีหน่วยความจำความยาว 1 ไบต์ ทำไมคุณไม่สามารถเข้าถึงตัวแปรความยาว 4 ไบต์ในการเข้าถึงหน่วยความจำเดียวในที่อยู่ที่ไม่ได้ลงนาม (เช่นไม่หารด้วย 4) เนื่องจากเป็นกรณีที่มีที่อยู่ที่จัดชิด

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

4
เหตุใดการจัดแนวโครงสร้างจึงขึ้นอยู่กับว่าประเภทฟิลด์เป็นแบบดั้งเดิมหรือผู้ใช้กำหนด
ในNoda Time v2 เรากำลังเคลื่อนไปสู่ความละเอียดระดับนาโนวินาที นั่นหมายความว่าเราไม่สามารถใช้จำนวนเต็ม 8 ไบต์เพื่อแสดงช่วงเวลาทั้งหมดที่เราสนใจได้อีกต่อไปนั่นทำให้ฉันต้องตรวจสอบการใช้หน่วยความจำของโครงสร้าง (จำนวนมาก) ของ Noda Time ซึ่งทำให้ฉัน เพื่อเปิดเผยความแปลกประหลาดเล็กน้อยในการตัดสินใจจัดตำแหน่งของ CLR ประการแรกผมรู้ว่านี่คือการตัดสินใจการดำเนินงานและการทำงานเริ่มต้นอาจมีการเปลี่ยนแปลงได้ตลอดเวลา ฉันรู้ว่าฉันสามารถแก้ไขได้โดยใช้[StructLayout]และ[FieldOffset]แต่ฉันอยากจะหาวิธีแก้ปัญหาที่ไม่ต้องการสิ่งนั้นถ้าเป็นไปได้ สถานการณ์หลักของฉันที่ฉันมีstructซึ่งมีข้อมูลอ้างอิงและแบบสองช่องค่าชนิดอื่น ๆ intที่มีเขตข้อมูลเหล่านั้นห่อง่ายสำหรับ ฉันหวังว่าจะแสดงเป็น 16 ไบต์บน 64-bit CLR (8 สำหรับการอ้างอิงและ 4 สำหรับแต่ละอัน) แต่ด้วยเหตุผลบางประการจึงใช้ 24 ไบต์ ฉันกำลังวัดพื้นที่โดยใช้อาร์เรย์ - ฉันเข้าใจว่าการจัดวางอาจแตกต่างกันในสถานการณ์ที่แตกต่างกัน แต่นี่เป็นจุดเริ่มต้นที่สมเหตุสมผล นี่คือโปรแกรมตัวอย่างที่แสดงให้เห็นถึงปัญหา: using System; using System.Runtime.InteropServices; #pragma warning disable 0169 struct Int32Wrapper { int x; } …

4
ตัวแปรสแต็กถูกจัดแนวโดย GCC __attribute __ ((aligned (x))) หรือไม่
ฉันมีรหัสต่อไปนี้: #include <stdio.h> int main(void) { float a[4] __attribute__((aligned(0x1000))) = {1.0, 2.0, 3.0, 4.0}; printf("%p %p %p %p\n", &a[0], &a[1], &a[2], &a[3]); } และฉันมีผลลัพธ์ต่อไปนี้: 0x7fffbfcd2da0 0x7fffbfcd2da4 0x7fffbfcd2da8 0x7fffbfcd2dac ทำไมที่อยู่ของ a[0]ไม่ได้เป็นหลาย0x1000? อะไรกันแน่ __attribute__((aligned(x))) ? ฉันเข้าใจคำอธิบายนี้ผิด? ฉันใช้ gcc 4.1.2

2
เหตุใดที่อยู่ของ argc และ argv 12 ไบต์แยกกัน
ฉันรันโปรแกรมต่อไปนี้บนคอมพิวเตอร์ของฉัน (Intel 64 บิตที่ใช้ Linux) #include <stdio.h> void test(int argc, char **argv) { printf("[test] Argc Pointer: %p\n", &argc); printf("[test] Argv Pointer: %p\n", &argv); } int main(int argc, char **argv) { printf("Argc Pointer: %p\n", &argc); printf("Argv Pointer: %p\n", &argv); printf("Size of &argc: %lu\n", sizeof (&argc)); printf("Size of &argv: %lu\n", sizeof (&argv)); …

1
วิธีการที่ทันสมัยในการทำให้ std :: vector จัดสรรหน่วยความจำที่จัดตำแหน่งไว้
คำถามต่อไปนี้เป็นเรื่องที่เกี่ยวข้อง แต่คำตอบที่มีความเก่าแก่และความคิดเห็นจากผู้ใช้มาร์ค Glisseแสดงให้เห็นมีวิธีการใหม่ตั้งแต่ C ++ 17 เพื่อแก้ไขปัญหานี้ที่อาจจะไม่ได้รับการกล่าวถึงอย่างเพียงพอ ฉันกำลังพยายามให้หน่วยความจำที่ทำงานสอดคล้องกันอย่างถูกต้องสำหรับ SIMD ในขณะที่ยังคงสามารถเข้าถึงข้อมูลทั้งหมดได้ ใน Intel ถ้าฉันสร้างเวกเตอร์ลอยชนิด__m256และลดขนาดลง 8 เท่ามันจะทำให้ฉันมีหน่วยความจำที่สอดคล้องกัน เช่น std::vector<__m256> mvec_a((N*M)/8); ในทางที่แฮ็กเล็กน้อยฉันสามารถชี้พอยน์เตอร์ไปยังองค์ประกอบเวกเตอร์เพื่อลอยตัวซึ่งทำให้ฉันสามารถเข้าถึงค่าลอยตัวส่วนบุคคล แต่ฉันต้องการให้มีการstd::vector<float>จัดตำแหน่งที่ถูกต้องและสามารถโหลดลงใน__m256และ SIMD ประเภทอื่น ๆ ได้โดยไม่ต้องแบ่งไฟล์ ฉันได้รับการมองเข้าไปในaligned_alloc นี่สามารถให้อาเรย์แบบ C ที่จัดเรียงอย่างถูกต้อง: auto align_sz = static_cast<std::size_t> (32); float* marr_a = (float*)aligned_alloc(align_sz, N*M*sizeof(float)); อย่างไรก็ตามฉันไม่แน่ใจว่าจะทำเช่นนี้std::vector<float>ได้อย่างไร ให้std::vector<float>เป็นเจ้าของไม่ได้ดูเหมือนจะเป็นไปได้marr_a ฉันเคยเห็นคำแนะนำบางอย่างที่ฉันควรเขียนตัวจัดสรรแบบกำหนดเองแต่ดูเหมือนว่าจะทำงานได้มากและบางทีด้วย C ++ ที่ทันสมัยมีวิธีที่ดีกว่า
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.