การจัดเรียงหน่วยความจำมีความสำคัญแค่ไหน? มันยังคงเป็นเรื่องสำคัญหรือไม่


15

จากช่วงเวลานี้ฉันได้ค้นหาและอ่านมากเกี่ยวกับการจัดตำแหน่งหน่วยความจำวิธีการทำงานและวิธีการใช้งาน บทความที่เกี่ยวข้องมากที่สุดที่ฉันได้พบในขณะนี้คือคนนี้

แต่ถึงอย่างนั้นฉันก็ยังมีคำถามบางอย่างเกี่ยวกับเรื่องนี้:

  1. ออกจากระบบฝังตัวเรามักจะมีหน่วยความจำขนาดใหญ่ในคอมพิวเตอร์ของเราที่ทำให้การจัดการหน่วยความจำน้อยลงมากฉันทำการปรับให้เหมาะสม แต่ตอนนี้มันเป็นสิ่งที่สามารถสร้างความแตกต่างได้ถ้าเราเปรียบเทียบโปรแกรมเดียวกันกับหรือ ไม่มีหน่วยความจำที่จัดเรียงใหม่และจัดตำแหน่ง?
  2. การจัดตำแหน่งหน่วยความจำมีข้อดีอื่น ๆ หรือไม่? ฉันอ่านบางแห่งว่า CPU ทำงานได้ดีขึ้น / เร็วขึ้นด้วยหน่วยความจำที่จัดเรียงเพราะใช้คำสั่งในการประมวลผลน้อยกว่า (หากคุณมีลิงค์สำหรับบทความ / เกณฑ์มาตรฐานเกี่ยวกับเรื่องนี้?) ในกรณีนี้ มีข้อดีมากกว่าสองอย่างนี้ไหม?
  3. ในลิงค์บทความที่บทที่ 5 ผู้เขียนพูดว่า:

    ระวัง: ใน C ++ คลาสที่ดูเหมือนว่า structs อาจผิดกฎนี้! (ไม่ว่าพวกเขาจะทำหรือไม่ขึ้นอยู่กับว่าคลาสพื้นฐานและฟังก์ชั่นสมาชิกเสมือนมีการใช้งานอย่างไรและแตกต่างกันตามคอมไพเลอร์)

  4. บทความส่วนใหญ่พูดคุยเกี่ยวกับโครงสร้าง แต่การประกาศตัวแปรท้องถิ่นได้รับผลกระทบจากความต้องการนี้เช่นกัน?

    คุณเคยคิดบ้างไหมว่าการจัดเรียงหน่วยความจำทำงานอย่างไรใน C ++ เนื่องจากดูเหมือนว่าจะมีความแตกต่างบ้างไหม?

คำถามเดิมนี้มีคำว่า "การจัดตำแหน่ง" แต่ไม่ได้ให้คำตอบสำหรับคำถามข้างต้น


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

คำตอบ:


11

ใช่ทั้งการจัดตำแหน่งและการจัดเรียงข้อมูลของคุณสามารถสร้างความแตกต่างอย่างมากในประสิทธิภาพไม่ใช่แค่เพียงไม่กี่เปอร์เซ็นต์เท่านั้น

ใช้วงนี้สองคำแนะนำสำคัญถ้าคุณใช้ลูปเพียงพอ

.globl ASMDELAY
ASMDELAY:
    subs r0,r0,#1
    bne ASMDELAY
    bx lr

ทั้งที่มีและไม่มีแคชและมีการจัดตำแหน่งที่มีและไม่มีแคชในการคาดคะเนสาขาและคุณสามารถเปลี่ยนแปลงประสิทธิภาพการทำงานของทั้งสองคำสั่งด้วยจำนวนเงินที่มีนัยสำคัญ (เห็บตัวจับเวลา):

min      max      difference
00016DDE 003E025D 003C947F

การทดสอบประสิทธิภาพที่คุณสามารถทำได้อย่างง่ายดาย เพิ่มหรือลบ nops รอบ ๆ รหัสภายใต้การทดสอบและทำหน้าที่กำหนดเวลาได้อย่างแม่นยำย้ายคำแนะนำภายใต้การทดสอบไปตามที่อยู่ในช่วงกว้างพอที่จะสัมผัสกับขอบของบรรทัดแคช ฯลฯ

สิ่งเดียวกันกับการเข้าถึงข้อมูล สถาปัตยกรรมบางแห่งบ่นเกี่ยวกับการเข้าถึงที่ไม่ได้จัดไว้ (ตัวอย่างเช่นการอ่าน 32 บิตตามที่อยู่ 0x1001) โดยให้ข้อมูลผิดพลาด บางคนที่คุณสามารถปิดการใช้งานความผิดพลาดและรับผลการปฏิบัติงาน คนอื่น ๆ ที่อนุญาตให้เข้าถึงแบบไม่ได้ลงพื้นที่คุณจะได้รับประสิทธิภาพการทำงานสูงสุด

บางครั้งมันก็เป็น "คำแนะนำ" แต่ส่วนใหญ่จะเป็นวงจรนาฬิกา / บัส

ดู memcpy implementations ใน gcc สำหรับเป้าหมายต่าง ๆ สมมติว่าคุณกำลังคัดลอกโครงสร้างที่มีขนาด 0x43 ไบต์คุณอาจพบว่ามีการใช้งานที่คัดลอกหนึ่งไบต์ที่เหลือ 0x42 จากนั้นคัดลอก 0x40 ไบต์ในชิ้นส่วนที่มีประสิทธิภาพมากจากนั้น 0x2 สุดท้ายอาจทำสองไบต์แบบเดี่ยวหรือเป็นการถ่ายโอน 16 บิต การจัดแนวและเป้าหมายเข้ามาเล่นถ้าแหล่งที่มาและที่อยู่ปลายทางอยู่ในแนวเดียวกันบอกว่า 0x1003 และ 0x2003 จากนั้นคุณสามารถทำหนึ่งไบต์จากนั้น 0x40 ในกลุ่มก้อนใหญ่แล้ว 0x2 แต่ถ้าหนึ่งคือ 0x1002 และอีก 0x1003 จริงน่าเกลียดและช้าจริง

ส่วนใหญ่แล้วจะเป็นรอบรถบัส หรือแย่กว่าจำนวนการโอน ใช้ตัวประมวลผลที่มีบัสข้อมูลขนาด 64 บิตเช่น ARM และทำการถ่ายโอนคำสี่คำ (อ่านหรือเขียน LDM หรือ STM) ตามที่อยู่ 0x1004 นั่นคือคำที่อยู่ในแนวเดียวกันและถูกต้องตามกฎหมาย แต่ถ้าเป็นรถบัส 64 ความกว้างบิตมีแนวโน้มว่าคำสั่งเดียวจะเปลี่ยนเป็นสามการถ่ายโอนในกรณีนี้คือ 32 บิตที่ 0x1004, 64 บิตที่ 0x1008 และ 32 บิตที่ 0x100A แต่ถ้าคุณมีคำสั่งเดียวกัน แต่ที่ที่อยู่ 0x1008 มันสามารถทำการถ่ายโอนคำสี่คำเดียวได้ที่ที่อยู่ 0x1008 การถ่ายโอนแต่ละครั้งมีการตั้งค่าที่เกี่ยวข้อง ดังนั้นความแตกต่างของที่อยู่ 0x1004 ถึง 0x1008 ด้วยตัวมันเองอาจเร็วขึ้นหลายเท่าแม้แต่ / esp เมื่อใช้แคชและทั้งหมดคือการเข้าชมแคช

การพูดถึงแม้ว่าคุณจะอ่านสองคำที่ที่อยู่ 0x1000 เทียบกับ 0x0FFC แต่การ 0x0FFC ที่มีแคชหายไปจะทำให้สองบรรทัดแคชอ่านโดยที่ 0x1000 เป็นหนึ่งในแคชบรรทัดคุณจะได้รับโทษของแคชที่อ่านต่อไปสำหรับสุ่ม การเข้าถึง (อ่านข้อมูลมากกว่าการใช้) แต่ก็เพิ่มเป็นสองเท่า วิธีจัดโครงสร้างของคุณหรือข้อมูลของคุณโดยทั่วไปและความถี่ในการเข้าถึงข้อมูลนั้นอาจทำให้เกิดการแคชได้

คุณสามารถจบการสตริปข้อมูลของคุณเช่นเมื่อคุณประมวลผลข้อมูลที่คุณสามารถสร้างการขับไล่คุณจะได้รับเคราะห์ร้ายที่แท้จริงและจบลงด้วยการใช้แคชเพียงเศษเสี้ยวของคุณและเมื่อคุณกระโดดผ่านมัน . โดยการผสมข้อมูลของคุณหรือจัดเรียงฟังก์ชั่นใหม่ในซอร์สโค้ด ฯลฯ คุณสามารถสร้างหรือลบการชนได้เนื่องจากแคชทั้งหมดไม่ได้ถูกสร้างขึ้นเท่ากับคอมไพเลอร์จะไม่ช่วยคุณตรงจุดนี้ แม้แต่การตรวจจับการโจมตีหรือปรับปรุงประสิทธิภาพก็ยังอยู่กับคุณ

ทุกสิ่งที่เราเพิ่มเข้ามาเพื่อปรับปรุงประสิทธิภาพบัสข้อมูลที่กว้างขึ้นท่อส่งข้อมูลแคชการคาดคะเนสาขาการดำเนินการหลายหน่วย / เส้นทาง ฯลฯ มักจะช่วยได้ แต่ส่วนใหญ่จะมีจุดอ่อนซึ่งสามารถถูกนำไปใช้โดยเจตนา มีคอมไพเลอร์หรือไลบรารีน้อยมากที่สามารถทำได้หากคุณสนใจประสิทธิภาพที่คุณต้องการปรับแต่งและหนึ่งในปัจจัยการปรับแต่งที่ใหญ่ที่สุดคือการจัดตำแหน่งของรหัสและข้อมูลไม่ใช่แค่จัดวางบน 32, 64, 128, 256 ขอบเขตบิต แต่สิ่งที่สัมพันธ์กันคุณต้องการลูปที่ใช้งานหนักหรือข้อมูลที่ใช้ซ้ำเพื่อไม่ให้ลงจอดด้วยวิธีแคชเดียวกันพวกเขาแต่ละคนต้องการตัวเอง คอมไพเลอร์สามารถช่วยยกตัวอย่างการสั่งซื้อคำสั่งสำหรับสถาปัตยกรรมแบบซูเปอร์สเกลาร์, การจัดเรียงคำสั่งใหม่ที่สัมพันธ์กันไม่สำคัญ

การกำกับดูแลที่ใหญ่ที่สุดคือการสันนิษฐานว่าโปรเซสเซอร์เป็นคอขวด ไม่เป็นความจริงมานานกว่าทศวรรษหรือมากกว่านั้นการป้อนตัวประมวลผลเป็นปัญหาและนั่นคือปัญหาที่เกิดขึ้นเช่นการจัดประสิทธิภาพการจัดแนวการแคชแคช ฯลฯ เข้ามาเล่น ด้วยการทำงานเพียงเล็กน้อยแม้ในระดับซอร์สโค้ดการจัดเรียงข้อมูลใหม่ในโครงสร้างการเรียงลำดับการประกาศตัวแปร / โครงสร้างการจัดเรียงฟังก์ชันภายในซอร์สโค้ดและรหัสพิเศษเล็กน้อยเพื่อจัดเรียงข้อมูลสามารถปรับปรุงประสิทธิภาพได้หลายครั้งหรือ มากกว่า.


+1 หากย่อหน้าสุดท้ายของคุณเท่านั้น แบนด์วิดธ์หน่วยความจำเป็นปัญหาที่สำคัญที่สุดสำหรับทุกคนที่พยายามเขียนโค้ดเร็ววันนี้ไม่นับจำนวนคำสั่ง และนี่หมายความว่าการปรับสิ่งต่างๆให้เหมาะสมเพื่อลดการพลาดแคชซึ่งสามารถทำได้โดยการปรับการจัดตำแหน่งในหลาย ๆ สถานการณ์มีความสำคัญอย่างมาก
จูลส์

หากรหัสและข้อมูลของคุณกลายเป็นแคชและคุณดำเนินการลูป / รอบในข้อมูลนั้นเพียงพอแล้วนับคำสั่งและที่คำแนะนำอยู่ในบรรทัดเรียกที่สาขาสาขาในท่อเทียบกับสิ่งที่พวกเขาพึ่งพาทำเรื่อง แต่ใน dram และ / หรือระบบที่ใช้แฟลชคุณต้องกังวลเกี่ยวกับการให้อาหารโปรเซสเซอร์ใช่
old_timer

15

ใช่การจัดเรียงหน่วยความจำยังคงมีความสำคัญ

โปรเซสเซอร์บางตัวไม่สามารถอ่านที่อยู่ที่ไม่ได้จัดแนวได้ หากคุณกำลังใช้งานฮาร์ดแวร์ดังกล่าวและคุณจัดเก็บจำนวนเต็มแบบไม่สอดคล้องกันคุณอาจต้องอ่านคำแนะนำสองคำแล้วตามด้วยคำแนะนำเพิ่มเติมเพื่อนำไบต์ต่างๆมาไว้ในที่ที่เหมาะสมเพื่อให้คุณสามารถใช้งานได้จริง . ข้อมูลที่มีการจัดชิดจึงสำคัญต่อประสิทธิภาพ

ข่าวดีก็คือคุณส่วนใหญ่ไม่ต้องสนใจ คอมไพเลอร์เกือบทุกภาษาเกือบทุกภาษาจะสร้างรหัสเครื่องซึ่งเคารพข้อกำหนดการจัดตำแหน่งของระบบเป้าหมาย คุณจะต้องเริ่มคิดเกี่ยวกับมันหากคุณควบคุมการแสดงข้อมูลในหน่วยความจำโดยตรงซึ่งไม่จำเป็นต้องอยู่ใกล้บ่อยเท่าที่เคยเป็นมา มันเป็นเรื่องที่น่าสนใจที่จะรู้และสำคัญยิ่งที่จะรู้ว่าถ้าคุณต้องการเข้าใจการใช้หน่วยความจำจากโครงสร้างต่างๆที่คุณกำลังสร้างและวิธีการจัดระเบียบสิ่งต่าง ๆ ให้มีประสิทธิภาพมากขึ้น (หลีกเลี่ยงการขยาย) แต่ถ้าคุณไม่ต้องการการควบคุมแบบนั้น (และสำหรับระบบส่วนใหญ่ที่คุณไม่ต้องการ) คุณสามารถมีความสุขกับอาชีพทั้งหมดโดยไม่รู้ตัวหรือใส่ใจกับมัน


1
โดยเฉพาะอย่างยิ่ง ARM ไม่รองรับการเข้าถึงที่ไม่จัดชิด และนั่นก็คือซีพียูเกือบทุกอย่างที่มือถือใช้
Jan Hudec

นอกจากนี้โปรดทราบว่า Linux จำลองการเข้าถึงที่ไม่ได้จัดแนวที่ค่าใช้จ่ายรันไทม์บางอย่าง แต่ Windows (CE และโทรศัพท์) ไม่ทำและการพยายามเข้าถึงที่ไม่ได้จัดแนวนั้นจะทำให้แอปพลิเคชันเสียหาย
Jan Hudec

2
แม้ว่านี่จะเป็นเรื่องจริงส่วนใหญ่โปรดทราบว่าบางแพลตฟอร์ม (รวมถึง x86) มีข้อกำหนดการจัดตำแหน่งที่แตกต่างกันขึ้นอยู่กับว่าจะใช้คำแนะนำแบบใดซึ่งคอมไพเลอร์ไม่สามารถทำงานได้เอง การดำเนินการบางอย่าง (เช่นคำสั่ง SSE ซึ่งหลายอย่างต้องมีการจัดตำแหน่ง 16 ไบต์) สามารถใช้สำหรับการดำเนินการบางอย่าง นอกจากนี้การเพิ่มการเติมเพิ่มเติมเพื่อให้สองรายการที่ใช้บ่อยร่วมกันเกิดขึ้นในบรรทัดแคชเดียวกัน (เช่น 16 ไบต์) อาจมีผลกระทบอย่างมากต่อประสิทธิภาพการทำงานในบางกรณีและไม่อัตโนมัติ
จูลส์

3

ใช่มันยังคงมีความสำคัญและในอัลกอริทึมที่สำคัญด้านประสิทธิภาพคุณไม่สามารถพึ่งพาคอมไพเลอร์ได้

ฉันจะแสดงรายการตัวอย่างเพียงไม่กี่:

  1. จากคำตอบนี้ :

โดยปกติไมโครโค้ดจะดึงข้อมูลปริมาณ 4 ไบต์ที่เหมาะสมจากหน่วยความจำ แต่หากไม่จัดแนวมันจะต้องดึงตำแหน่ง 4 ไบต์สองตำแหน่งจากหน่วยความจำและสร้างปริมาณ 4 ไบต์ที่ต้องการจากไบต์ที่เหมาะสมของสองตำแหน่งใหม่

  1. ชุดคำสั่ง SSE นั้นต้องการการจัดตำแหน่งแบบพิเศษ ถ้าไม่ตรงคุณต้องใช้ฟังก์ชั่นพิเศษเพื่อโหลดและเก็บข้อมูลไว้ในหน่วยความจำที่ไม่ได้จัดแนว นั่นหมายถึงคำแนะนำพิเศษสองคำ

หากคุณไม่ได้ทำงานเกี่ยวกับอัลกอริทึมที่สำคัญด้านประสิทธิภาพเพียงลืมการจัดตำแหน่งหน่วยความจำ ไม่จำเป็นสำหรับการเขียนโปรแกรมปกติจริงๆ


1

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

หากคุณจัดการเพื่อสร้างอาร์เรย์จำนวนเต็มที่ไม่ได้จัดแนวจากนั้นในโปรเซสเซอร์ทั่วไปของ Intel การประมวลผลรหัสของคุณที่อาร์เรย์จะทำงานช้าลงเล็กน้อยกว่าสำหรับข้อมูลที่จัดตำแหน่ง บนโปรเซสเซอร์ ARM นั้นจะทำงานช้าลงเล็กน้อยหากคุณบอกคอมไพเลอร์ว่าข้อมูลไม่ได้จัดแนว อาจทำงานช้าลงมากหรือแย่ลงหรือให้ผลที่ผิดขึ้นอยู่กับรุ่นของโปรเซสเซอร์และระบบปฏิบัติการหากคุณใช้ข้อมูลที่ไม่ได้จัดแนวโดยไม่แจ้งให้คอมไพเลอร์ทราบ

การอธิบายการอ้างอิงถึง C ++: ใน C ฟิลด์ทั้งหมดในโครงสร้างจะต้องเก็บไว้ในลำดับหน่วยความจำจากน้อยไปหามาก ดังนั้นหากคุณมีช่องถ่าน / คู่ / ถ่านและต้องการให้ทุกอย่างสอดคล้องกันคุณจะมีหนึ่งไบต์ถ่านเจ็ดไบต์ที่ไม่ได้ใช้แปดไบต์คู่แปดไบต์ถ่านหนึ่งไบต์เจ็ดไบต์ที่ไม่ได้ใช้ ใน C ++ structs มันเหมือนกันสำหรับความเข้ากันได้ แต่สำหรับ structs คอมไพเลอร์อาจเรียงลำดับฟิลด์ใหม่ดังนั้นคุณอาจมีหนึ่งไบต์ถ่านอีกไบต์หนึ่งไม่ได้ใช้หกไบต์ 8 ไบต์สองครั้ง ใช้ 16 แทน 24 ไบต์ ใน C structs นักพัฒนามักจะหลีกเลี่ยงสถานการณ์นั้นและมีเขตข้อมูลในลำดับที่แตกต่างกันตั้งแต่แรก


1
ข้อมูลที่ไม่ได้จัดแนวเกิดขึ้นในหน่วยความจำ โปรแกรมที่ไม่มีโครงสร้างข้อมูลที่บรรจุอย่างถูกต้องสามารถได้รับโทษประสิทธิภาพสูงถึงแม้จะมีการจัดเรียงค่าที่ไม่เหมาะสม ตัวอย่างเช่นในรหัส lthreaded ค่าสองค่าในบรรทัดแคชเดียวจะทำให้เกิดไปป์ไลน์ขนาดใหญ่เมื่อเธรดสองเธรดเข้าถึงได้ในเวลาเดียวกัน (ไม่สนใจประเด็นความปลอดภัยของเธรด)
greyfade

คอมไพเลอร์ C ++ อาจเรียงลำดับฟิลด์ใหม่ภายใต้เงื่อนไขบางประการเท่านั้นซึ่งอาจไม่เป็นไปตามเงื่อนไขหากคุณไม่ทราบกฎเหล่านั้น นอกเหนือจากนั้นฉันไม่ได้ตระหนักถึงคอมไพเลอร์ C ++ ที่ใช้เสรีภาพนี้จริง ๆ
Sjoerd

1
ฉันไม่เคยเห็นช่องสั่งซื้อคอมไพเลอร์ C อีกต่อไป ฉันได้เห็นช่องว่างแทรกจำนวนมากและการจัดตำแหน่งระหว่างตัวอักษร / ints ตัวอย่างเช่นแม้ว่า ..
PaulHK

1

คะแนนที่ดีหลายข้อถูกกล่าวถึงแล้วในคำตอบข้างต้น เพียงเพื่อเพิ่มแม้ในระบบที่ไม่ได้ฝังตัวซึ่งจัดการกับการค้นหาข้อมูล / การขุดประสิทธิภาพของหน่วยความจำและเวลาในการเข้าถึงมีความสำคัญอย่างยิ่งที่นอกเหนือจากรหัสการประกอบการจัดตำแหน่งจะเขียนเหมือนกัน

ผมยังแนะนำให้อ่านคุ้มค่า: http://dewaele.org/~robbe/thesis/writing/references/what-every-programmer-should-know-about-memory.2007.pdf


1

การจัดเรียงหน่วยความจำมีความสำคัญแค่ไหน? มันยังคงเป็นเรื่องสำคัญหรือไม่

ใช่. เลขที่มันขึ้นอยู่กับ

ออกจากระบบฝังตัวเรามักจะมีหน่วยความจำขนาดใหญ่ในคอมพิวเตอร์ของเราที่ทำให้การจัดการหน่วยความจำน้อยลงมากฉันทำการปรับให้เหมาะสม แต่ตอนนี้มันเป็นสิ่งที่สามารถสร้างความแตกต่างได้ถ้าเราเปรียบเทียบโปรแกรมเดียวกันกับหรือ ไม่มีหน่วยความจำที่จัดเรียงใหม่และจัดตำแหน่ง?

แอปพลิเคชันของคุณจะมีหน่วยความจำขนาดเล็กลงและทำงานได้เร็วขึ้นหากจัดแนวอย่างเหมาะสม ในแอปพลิเคชันเดสก์ท็อปทั่วไปมันจะไม่สำคัญนอกกรณีที่หายาก / ผิดปกติ (เช่นแอปพลิเคชันของคุณจะลงท้ายด้วยคอขวดประสิทธิภาพเดียวกันและต้องการการปรับให้เหมาะสม) นั่นคือแอปจะเล็กลงและเร็วขึ้นหากจัดแนวอย่างเหมาะสม แต่สำหรับกรณีที่ใช้งานได้จริงมันไม่ควรส่งผลกระทบต่อผู้ใช้ไม่ทางใดก็ทางหนึ่ง

การจัดตำแหน่งหน่วยความจำมีข้อดีอื่น ๆ หรือไม่? ฉันอ่านบางแห่งว่า CPU ทำงานได้ดีขึ้น / เร็วขึ้นด้วยหน่วยความจำที่จัดเรียงเพราะใช้คำสั่งในการประมวลผลน้อยกว่า (หากคุณมีลิงค์สำหรับบทความ / เกณฑ์มาตรฐานเกี่ยวกับเรื่องนี้?) ในกรณีนี้ มีข้อดีมากกว่าสองอย่างนี้ไหม?

มันสามารถ เป็นสิ่งที่ควรคำนึงถึงในขณะที่เขียนโค้ด แต่ในกรณีส่วนใหญ่มันไม่สำคัญเลย (นั่นคือฉันยังคงจัดเรียงตัวแปรสมาชิกของฉันโดยใช้หน่วยความจำและความถี่การเข้าถึงซึ่งควรทำให้การแคชง่ายขึ้น - แต่ฉันทำเช่นนั้น ความง่ายในการใช้ / อ่านและสร้างรหัสใหม่ไม่ใช่เพื่อการแคช)

คุณเคยคิดบ้างไหมว่าการจัดเรียงหน่วยความจำทำงานอย่างไรใน C ++ เนื่องจากดูเหมือนว่าจะมีความแตกต่างบ้างไหม?

ฉันอ่านเกี่ยวกับสิ่งนี้เมื่อสิ่งที่จัดวางออกมา (C ++ 11?) ฉันไม่ได้ใส่ใจกับมันมาตั้งแต่ (ฉันทำแอพพลิเคชั่นเดสก์ท็อปส่วนใหญ่และการพัฒนาเซิร์ฟเวอร์แบ็กเอนด์ในปัจจุบัน)

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