หน่วยความจำที่จัดสรรในเวลาคอมไพล์หมายถึงคอมไพเลอร์แก้ไข ณ เวลารวบรวมซึ่งบางสิ่งจะถูกจัดสรรภายในแผนที่หน่วยความจำกระบวนการ
ตัวอย่างเช่นพิจารณาอาร์เรย์ทั่วโลก:
int array[100];
คอมไพเลอร์รู้เวลารวบรวมขนาดของอาเรย์และขนาดของint
มันดังนั้นมันจึงรู้ขนาดทั้งหมดของอาเรย์ ณ เวลารวบรวม ตัวแปรโกลบอลมีระยะเวลาการจัดเก็บแบบสแตติกตามค่าเริ่มต้น: มันถูกจัดสรรในพื้นที่หน่วยความจำแบบสแตติกของพื้นที่หน่วยความจำกระบวนการ (ส่วน. data / .bss) ระบุว่าข้อมูลคอมไพเลอร์ตัดสินใจในระหว่างการรวบรวมในสิ่งที่อยู่ของพื้นที่หน่วยความจำแบบคงที่อาร์เรย์จะ
แน่นอนว่าที่อยู่หน่วยความจำคือที่อยู่เสมือน โปรแกรมถือว่ามีพื้นที่หน่วยความจำทั้งหมดของตัวเอง (ตัวอย่างเช่นจาก 0x00000000 ถึง 0xFFFFFFFF) นั่นเป็นสาเหตุที่คอมไพเลอร์สามารถตั้งสมมติฐานเช่น "โอเคอาร์เรย์จะอยู่ที่ 0x00A33211" ณ รันไทม์ที่แอดเดรสถูกแปลเป็นแอดเดรสจริง / ฮาร์ดแวร์โดย MMU และ OS
ค่าเริ่มต้นสิ่งที่เก็บแบบคงที่แตกต่างกันเล็กน้อย ตัวอย่างเช่น:
int array[] = { 1 , 2 , 3 , 4 };
ในตัวอย่างแรกของเราคอมไพเลอร์ตัดสินใจว่าจะจัดสรรอาเรย์เท่านั้นโดยเก็บข้อมูลนั้นไว้ในไฟล์ที่เรียกใช้งานได้
ในกรณีของสิ่งที่กำหนดค่าเริ่มต้นคอมไพเลอร์ยังอัดฉีดค่าเริ่มต้นของอาร์เรย์ลงในไฟล์เรียกทำงานและเพิ่มรหัสซึ่งบอกให้โปรแกรมโหลดเดอร์ทราบว่าหลังจากการจัดสรรอาร์เรย์เมื่อเริ่มต้นโปรแกรมอาร์เรย์ควรเต็มไปด้วยค่าเหล่านี้
นี่คือสองตัวอย่างของชุดประกอบที่สร้างขึ้นโดยคอมไพเลอร์ (GCC4.8.1 พร้อมเป้าหมาย x86):
รหัส C ++:
int a[4];
int b[] = { 1 , 2 , 3 , 4 };
int main()
{}
การชุมนุมเอาท์พุท:
a:
.zero 16
b:
.long 1
.long 2
.long 3
.long 4
main:
pushq %rbp
movq %rsp, %rbp
movl $0, %eax
popq %rbp
ret
อย่างที่คุณเห็นค่าต่างๆจะถูกฉีดเข้าไปในชุดประกอบโดยตรง ในอาร์เรย์a
คอมไพเลอร์สร้างการเริ่มต้นเป็นศูนย์ของ 16 ไบต์เนื่องจากมาตรฐานบอกว่าสิ่งที่เก็บแบบคงที่ควรเริ่มต้นเป็นศูนย์โดยค่าเริ่มต้น:
8.5.9 (Initializers) [หมายเหตุ]:
วัตถุทุกอันของระยะเวลาการจัดเก็บแบบสแตติกจะเริ่มต้นที่ศูนย์เมื่อเริ่มต้นโปรแกรมก่อนที่จะมีการเริ่มต้นอื่น ๆ ในบางกรณีการเตรียมใช้งานเพิ่มเติมเสร็จในภายหลัง
ฉันมักจะแนะนำให้คนถอดรหัสของพวกเขาเพื่อดูว่าคอมไพเลอร์ทำอะไรกับรหัส C ++ สิ่งนี้ใช้จากคลาส / ระยะเวลาการเก็บข้อมูล (เช่นคำถามนี้) กับการปรับแต่งคอมไพเลอร์ขั้นสูง คุณสามารถสั่งคอมไพเลอร์ของคุณเพื่อสร้างแอสเซมบลี แต่มีเครื่องมือที่ยอดเยี่ยมในการทำเช่นนี้บนอินเทอร์เน็ตในลักษณะที่เป็นมิตร ที่ฉันชอบคือGCC Explorer ที่