Embedded C Development Part IV : Memory Section : แบ่งแยกเพราะแตกต่าง

ในหนึ่งโปรแกรมเกิดจากไฟล์ใหญ่น้อยหลายไฟล์ ทั้งไฟล์ที่คนพัฒนาเขียนขึ้น เอง และไฟล์ที่คลังโปรแกรมของคอมไพเลอร์มีมาให้ แต่ละไฟล์ถูกยึดโยงเข้า ด้วยกัน ผสานเป็นเนื้อเดียวกัน วิธีการผสานไฟล์จำนวนมากเข้าเป็นหนึ่งเดียวถูก กำหนดด้วยไฟล์ที่ทำหน้าที่กำหนดรูปแบบ (Script File) ตัวเชื่อมโยงแต่ละตัวมี ชุดคำสั่งที่ทำหน้าที่กำหนดรูปแบบเฉพาะของตัวเอง เป็นชุดคำสั่งที่เกี่ยวพันโดยตรง กับลักษณะทางภูมิศาสตร์ของตัวประมวลผล ภูมิศาสตร์ของการจัดวางตำแหน่ง ของหน่วยความจำ ตำแหน่งของอุปกรณ์เชื่อมต่อตำแหน่งที่แสดงถึงถิ่นที่อยู่ของ สรรพสิ่งที่ตัวประมวลผลจักใช้ในการอ้างอิงเพื่อให้ทุกการกระทำสามารถสำฤทธิ์ผล ตามเป้าหมาย ดังนั้นการจักเชื่อมโยงโปรแกรมภายหลังจากคอมไพล์แต่ละไฟล์ให้ ได้ไฟล์ object ไฟล์ที่นับได้ว่าเป็นเพียงไฟล์วัตถุดิบ ให้กลายเป็นไฟล์หนึ่งเดียวที่ สามารถนำไปกระทำการได้ (execute file) จึงต้องเข้าใจทั้งโครงสร้างของตัว ประมวลผลและคำสั่งอันซับซ้อนในการเชื่อมโยง จัดวางส่วนต่าง ๆ ของโปรแกรม ทั้งหมด ให้อยู่ในตำแหน่งที่ถูกต้องเหมาะสม แต่ละโปรแกรมถูกจัดแบ่งเป็นส่วน แต่ละส่วนมีลักษณะเฉพาะของตัวเอง มีหน้าที่และข้อจำกัดที่แตกต่างจากส่วนอื่น ลักษณะอันจำเพาะนี้บ่งบอกด้วยพฤติกรรมของการเข้าถึงใช้งาน เช่น ใช้เพื่ออ่าน อย่างเดียว หรือทั้งอ่านทั้งเขียนเปลี่ยนแปลงค่าใหม่ บ่งบอกด้วยวิธีการก่อกำเนิด และช่วงชีวิตของการดำรงอยู่ เช่น เกิดขึ้นในช่วงเวลากระชั้นสั้นในขณะทำการ (run time) หรือเกิดขึ้นเมื่อแรกสร้างโปรแกรมกระทำการ (compile time) และเมื่อแรกเกิดขึ้นขณะสร้างโปรแกรมมีค่าตั้งต้นติดตัวอะไรมาด้วยหรือไม่

การแบ่งแยกไฟล์เป็นสัดส่วนสำหรับคอมไพเลอร์นั้น ส่วนใหญ่กระทำการ โดยการกำหนดด้วยคำ section แต่ละไฟล์มีหลาย section ครั้งเมื่อนำไฟล์ ทั้งหลายมาเชื่อมโยงเป็นหนึ่งเดียวเกิดเป็นไฟล์กระทำการนั้น section แบบเดียวกันของทุกไฟล์จะถูกจัดรวมให้อยู่เป็นกลุ่มเป็นก้อนเดียวกัน ดังนั้นหาก พิเคราะห์จากไฟล์กระทำการ จะเห็นว่าในแต่ละกลุ่มก้อนเป็นการเอาส่วนที่มี ลักษณะจำเพาะเดียวกันของทุกไฟล์มาจัดเรียงกันไว้ จากกลุ่มก้อนเล็ก ๆ ของทุกไฟล์กลายเป็นอยู่ในกลุ่มก้อนใหญ่เดียวกัน โดยมีถิ่นที่อยู่ซึ่งกำหนดเป็นตำแหน่งที่ แน่ชัดว่าเป็นที่ใดโดย Linker Script File ถิ่นที่อยู่นี้ตัว Loader จะใช้ในการนำสิ่ง ต่าง ๆ ใน section ไปเก็บไว้ การกำหนดจัดส่วนเป็นกลุ่มเป็นก้อนอาจจะเปรียบเทียบเคียงได้กับนามสกุล ของผู้คน คนในชาติตระกูลเดียวกัน ถือเป็นส่วนเดียวกันมีความเกี่ยวโยงเป็นเครือ ญาติกัน มีความเป็นจำเพาะจากตระกูลอื่น การกำหนด section จึงมักจะกระทำโดยใช้ สัญลักษณ์เป็นจุด อย่างเช่น .text , .data , .rodata และ .bss เป็นต้น ถือ เป็น section พื้นฐานที่คอมไพเลอร์ต่าง ๆ ใช้ จะจัดแบ่งโปรแกรมออกเป็นกลุ่ม เริ่มจากหลักพื้นฐานที่เรียบง่ายว่า เนื้อแท้ ของโปรแกรมประกอบด้วยส่วนที่เป็นคำสั่ง (code) กับส่วนที่เป็นข้อมูล (data) ตรงไปตรงมาว่าคำสั่งคือตัวอักษรที่เรียงร้อยเป็นถ้อยคำที่มีความหมายให้ผลปฏิบัติ ชัดเจนตามกฎตามเกณฑ์ของภาษา กำหนดแล้ว แปลความหมายแล้ว ดำเนินการ แล้วก็เป็นเช่นเดิม สมควรถูกเรียกขานว่า .text และพึงจัดเก็บไว้ในหน่วยความจำที่ไม่เปลี่ยนสภาพต่อให้ไฟเลี้ยงจะลดน้อยหรือถอยหมด เป็นหน่วยความจำที่ถูก เรียกว่าเป็นแบบ non-volatile เช่น ROM , EPROM , EEPROM หรือ Flash สำหรับข้อมูลซึ่งมีประกอบกับคำสั่งเพื่อให้ทุกการกระทำดำเนินการบรรลุผลสำเร็จ และเป็นข้อมูลที่เปลี่ยนแปลงสภาวะการดำรงอยู่ได้ตั้งแต่ เริ่มก่อเกิด ตั้งอยู่ และ บางส่วนบางเวลาต้องดับไป จึงมักถูกเก็บไว้ในหน่วยความจำแบบ volatile เช่น SRAM , DRAM เป็นต้น ตัวแปรซึ่งเปลี่ยนค่าไปตามสภาวะหากอาศัยอำนาจของคำว่าขอบเขต กว้าง ใหญ่แคบเล็กมาจัดแบ่ง ก็จะพบว่ามีสองลักษณะพื้นฐานคือ อยู่ในฟังก์ชัน กับอยู่ นอกฟังก์ชัน อยู่ในฟังก์ชันโดยปกติย่อมถูกปิดกั้นไม่อาจมองเห็นได้จากภายนอก ฟังก์ชัน แต่อยู่นอกฟังก์ชันกลับสามารถถูกพบเห็นได้จากในฟังก์ชันและทุกส่วนใน ไฟล์ กระทั่งว่าการปรับแต่งขอบเขตโดยคำเช่น extern ตัวแปรนอกฟังก์ชันซึ่งอยู่ — 3 — ในไฟล์อื่นก็สามารถถูกข้องแวะได้เช่นกัน ตัวแปรที่ถูกประกาศตัวนอกฟังชันเรียกว่า เป็น global variable ตัวแปรที่ถูกประกาศตัวในฟังก์ชันเรียกเป็น local variable ตัวแปรนอกฟังก์ชัน global variable ถูกสร้างขึ้นในขั้นตอบของการ คอมไพล์โปรแกรม ดังนั้นมันจึงมีอยู่ตั้งแต่ต้นและตลอดไปในการทำงานตาม โปรแกรม ถือว่าเมื่อตัวแปรเกิดมีขึ้นหรือถูก allocate หน่วยความจำให้จัดเก็บแล้ว หน่วยความจำนั้นตัวแปรตัวนั้นจะคงสถิตย์ดำรงอยู่ไปตลอดกาล ตัวแปรนอกฟังก์ชัน Local variable ถูกสร้างขึ้นในขั้นตอนการทำงานตาม โปรแกรม เกิดขึ้นและดำรงอยู่ในช่วงเวลากระชั้นสั้น เฉพาะขณะเมื่อตัวประมวลผล ลงมือกระทำการตามคำสั่งในฟังก์ชันนั้น ก่อนเข้าทำคำสั่งในฟังก์ชัน และหลังสิ้นสุด การกระทำในฟังก์ชัน ไม่ปรากฏให้เห็นเหมือนพลันสาบสูญตลอดไป ตัวแปรจัก สามารถกลับมาเกิดใหม่ มีตัวตนใหม่ ดำรงใหม่อีกครั้ง ถ้าฟังก์ชันนั้นถูกยกขึ้นมา กระทำการอีก เมื่อเกิดใหม่ มีตัวตนใหม่ ดำรงใหม่ ถิ่นที่อยู่ของมันในหน่วยความจำ ก็ย่อมสามารถเปลี่ยนแปลงไปได้ตามสภาพปัจจุบันการณ์ค่าที่เป็นไปในอดีตถูกลบ หายคล้ายไม่รับรู้ว่าเคยมี เคยอยู่ เคยเป็นไป ดูเหมือนว่าที่ทางตำแหน่งของการประกาศตัวส่งผลต่อพฤติกรรมการทำงาน อย่างใหญ่หลวง หากอยู่ในฟังก์ชันเป็นตัวแปรแบบเฉพาะถิ่นฐาน เป็น local ต่อ ฟังก์ชันนั้น จักไม่สามารถจักดำรงอยู่อย่างคงทนสถิตย์อยู่คู่โปรแกรมได้เฉกเช่น global variable เลยหรือ ความจริงก็สมควรเป็นเช่นนั้น เพราะการคงอยู่แบบไม่ ถูกใช้งาน ไร้การเหลียวแล เมื่อตัวประมวลผลกระทำคำสั่งภายนอกฟังก์ชันนั้น ก็รัง แต่จะทำให้หน่วยความจำนั้นถูกทิ้งร้างอย่างไร้ประโยชน์ สิ้นคำว่าคู่ควร ขัดขวาง ไม่ให้ถูกนำไปใช้ประโยชน์เพื่อการอื่น ซ้ำร้ายหากหน่วยความจำอื่นถูกใช้งานจน หมดสิ้นไม่เหลือเพื่อรองรับความต้องการอื่นอีกต่อไป จะส่งผลร้ายถึงขั้นส่งผลให้ ระบบล้มเหลว กระทำอะไรต่อไปไม่ได้เลย

หากปรารถนาเพียงแค่ให้ไม่สูญหายไปตามจังหวะเวลาของการลงมือกระทำ การเพราะผลจากการกระทำในครั้งนั้น จำต้องส่งผลต่อการกระทำฟังก์ชันเดิมครั้ง ต่อไป แต่ไม่หวังให้ผู้อยู่ภายนอกฟังก์ชันมองเห็น คำสั่งต่าง ๆ นอกฟังก์ชันต้องไม่ รับรู้การมีอยู่ของมันจะกระทำได้อย่างไร ภาษาซียินยอมให้มีการดำรงอยู่ของตัว แปรเฉพาะถิ่นแบบนี้ได้ เพียงอาศัยการปรับแต่งที่เรียบง่าย เพียงเติมคำ static นำหน้าในตอนประกาศตัวแปรนั้น คำ static นี้มีผลทำให้ตัวแปร local มีคุณสมบัติ เหมือน global ตรงที่ว่าเมื่อเกิดมีขึ้น ก็จะตั้งอยู่อย่างนั้น ไม่ดับไป แต่แตกต่างตรงที่ ของเขตการมองเห็น คำ static จึงนับเป็นการจำกัดขอบเขตการมองเห็น จำกัด อาณาบริเวณในการอ้างถึงเท่านั้น ที่จริงคำ static สามารถถูกใช้เติมหน้าตัวแปร แบบ global ได้เช่นเดียวกัน เป็นการเติมเพื่อจำกัดบริเวณให้ขอบเขตการมองเห็น เป็นเพียงเฉพาะในไฟล์นั้น จะอ้างถึงจากที่อื่นใดนอกหรือภายในฟังก์ชันซึ่งอยู่ไฟล์ เดียวกันนั้นล้วนกระทำได้ แต่ในไฟล์อื่นไม่สามารถใช้คำ extern มาเอาชนะ ข้อจำกัดนี้ได้คำ static ยังใช้จำกัดอาณาบริเวณของฟังก์ชันได้เช่นเดียวกัน ฟังก์ชัน ใดที่ถูกนำด้วยคำนี้จะถูกจำกัดให้เห็นกันภายในไฟล์เท่านั้น ไฟล์อื่น ๆ ล้วนไม่ สามารถอ้างถึง แต่ละไฟล์โปรแกรมเมื่อถูกคอมไพล์ให้เป็นไฟล์วัตถุ ทั้งหลายทั้งปวงของ ความเป็นไฟล์โปรแกรมจะถูกแบ่งแยกจันออกเป็นกลุ่มเป็นก้อนเป็นท่อนเป็นตอน แต่ละกลุ่มแต่ละก้อน แต่ละท่อนแต่ละตอนถูกเรียกว่า Section การจัดแยกขั้น พื้นฐานแบ่งออกได้เป็น สามกลุ่มก้อนหลักได้แก่ text section, data section และ BSS section

text section เป็นส่วนของหน่วยความจำที่ใช้เก็บคำสั่งการที่ตัวประมวลผล จะต้องนำไปปฏิบัติ เมื่อคำสั่งเป็นสิ่งที่เปลี่ยนแปลงไม่ได้ในขณะลงมือกระทำ Text section โดยทั่วไปแล้วจึงมักมีตำแหน่งอยู่ในส่วนของหน่วยความจำแบบ nonvolatile ซึ่งเมื่อมีค่าใดก็จะไม่แปรเปลี่ยน แม้กระทั่งขณะไม่จ่ายไฟเลี้ยง สำหรับไมโครคอนโทรลเลอร์แล้วมักจะเป็นหน่วยความำแบบ flash ที่ฝังอยู่ไว้ในภายใน ตัวชิพ ส่วนของ text section เก็บรหัสคำสั่งของแต่ละไฟล์เมื่อผ่านขั้นตอนการผูกโยงกับไฟล์วัตถุอื่น ๆ เกิดเป็นไฟล์ที่สามารถนำไปดำเนินการได้ ก็จะถูกโหลดจาก เครื่องคอมพิวเตอร์ที่ใช้สร้างมันขึ้นมา ลงไปยังบริเวณของหน่วยความจำแบบ nonvolatile เป้าหมายก่อนที่ระบบจะลงมือปฏิบัติการ ตำแหน่งที่โหลดลงไปนี้เรียก load address เป็นตำแหน่งที่สามารถคงอยู่ถาวรตลอดไปถือเป็นตำแหน่งเดียวกับ ในขณะลงกระทำการที่เรียกว่า run address หรือไม่เช่นนั้น text section ก็ สามารถถูกคัดลอกไปยังหน่วยความจำแบบ RAM ซึ่งเป็นแบบ volatile ผันแปรได้ เป้าประสงค์หลักอาจไม่ใช่เพื่อการดัดแปลงแก้ไขคำสั่งได้ในขณะปฏิบัติการ แต่มัก เป็นเหตุผลด้านความรวดเร็วในการลงมือกระทำ เพราะหน่วยความจำแบบ RAM มักใช้เวลาในการเข้าถึงตัวข้อมูลต่ำกว่า การอ่านคำสั่งเพื่อนำไปปฏิบัติจึงเกิดขึ้นได้ อย่างรวดเร็วกว่า อย่างนั้นเรียกว่าตำแหน่ง run address ขณะกระทำการของ text section จึงเป็นคนละตำแหน่งกับ load address ขณะถูกโหลดมาเก็บไว้ เตรียมพร้อมรับการกระทำ

data Section ใช้เก็บข้อมูลที่แปรเปลี่ยนขณะกระทำการ ข้อมูลที่ว่าอยู่ใน รูปของตัวแปร ตัวแปรที่เกิดมีขึ้นตั้งแต่ขั้นตอนของการคอมไพล์โปรแกรม ไม่ใช่ตัว แปรที่จะเกิดมีขึ้นเฉพาะในช่วงเวลากระชั้นสั้นขณะลงมือกระทำการเมื่อหมดหน้าที่ ก็ถูกกำจัดหายไปเป็นไปตามสภาวะแห่งความไม่เที่ยงแท้คือ เกิดขึ้น ตั้งอยู่ และดับ ไป ตัวแปรเปลี่ยนแปลงไปตามสภาวะแบบนี้นั้นจะดำรงตนอยู่ในโครงสร้างข้อมูล แบบ stack โครงสร้างข้อมูลซึ่งจะมีสภาพการณ์เป็นอย่างไร ต้องเป็นไปตาม เงื่อนไขของการกระทำคำสั่งโดยแท้ซึ่งแน่นอนว่าต้องแปรเปลี่ยนไปตลอดเวลา ตัว แปรที่ถูกเก็บใน data section เป็นตัวแปรแบบ global variable ซึ่งวางตัวเองอยู่ นอกเหนือฟังก์ชัน ประการสำคัญคือ ต้องเป็นตัวแปรที่ถูกกำหนดค่าไว้ตั้งแต่เริ่มต้น ประกาศการมีอยู่ของตัวแปร เรียกว่าเป็นตัวแปรแบบ initialized variable เท่านั้น

BSS section — คำBSS โดยเนื้อแท้แล้วย่อมาจากคำ Block Started by Symbol คำเก่าแก่ในวงการมีประวัติความเป็นมายาวนาน แต่บางคนเต็มใจจะ เรียกว่า Better Save Space สะท้อนลักษณะเด่นที่ใช้สำหรับค่าตัวแปรที่ยังไม่มีค่า แน่ชัดว่าเป็นเท่าใด เมื่อไม่แน่ชัดในตอนคอมไพล์จึงหมายความว่าไม่ต้องสิ้นเปลืองเสียเนื้อที่ในการจัดเก็บในไฟล์วัตถุ เหมือนอย่างตัวแปรซึ่งถูกกำหนดค่ามาตั้งแต่ต้น ใน data section เนื้อที่สำหรับตัวแปรที่ไม่ได้มีค่าตั้งแต่ต้นตอนคอมไพล์นี้จะเกิดมี ขึ้นในตอนลงมือกระทำการจริง แต่เป็นตัวแปรที่จำเป็นต้องได้รับการจัดสรรเนื้อที่ หน่วยความจำไว้ให้เพราะต้องให้สถิตย์อยู่ตลอดไป เมื่อเริ่มต้นก่อนเริ่มใช้งานจะถูก ยัดเยียดค่าให้เป็นศูนย์ถ้วนทั่วทุกตัวแปร สำหรับภาษาซีแล้ว วัตถุธาตุอะไรก็ตามถ้า ไม่มีตัวตั้งค่ามาดำเนินการกำหนดอย่างแจ้งชัด จะถูกเริ่มค่าให้เป็นศูนย์ หากเป็น พอยน์เตอร์ก็จะเป็นพอยน์เตอร์ศูนย์ คือเป็น NULL คำว่าเป็นศูนย์หมายความว่าค่า ของทุกบิตของตัวแปรของพอยน์เตอร์นั้นป็นศูนย์หมด ตัวแปรที่จัดอยู่ในกลุ่มนี้ จะต้องถูกประกาศอยู่ในของเขตของไฟล์ และอยู่นอกขอบเขตของฟังก์ชัน ประกาศ แบบเพียงบอกเล่าการมีอยู่แต่ไม่ได้ระบุว่ามีค่าเป็นเท่าไร การมีอยู่แบบสถิตย์ ตลอดไปนี้สามารถระบุให้ชัดเจนได้โดยใช้คำ static ดังนั้นแม้ตัวแปรที่อยู่ใน ขอบเขตภายในฟังก์ชัน เป็นแบบ lolal แต่หากถูกแต่งเติมโดยใช้คำ static นำหน้า และไม่ถูกตั้งค่าตอนประกาศ ก็จะอยู่ในกลุ่ม bss นี้เช่นเดียวกัน

rodata Section เป็นกลุ่มก้อนพิเศษใช้เก็บข้อมูลที่ถูกกำหนดสภาพโดยใช้ คำปรับเปลี่ยนคุณสมบัติข้อมูลให้มีค่าคงที่ ชื่อที่ประกาศซึ่งอาจเหมือนเป็นตัวแปร แต่หากเมื่อปรับแต่งคุณสมบัติด้วยคำ const ชื่อนั้นจะพลันมีสภาพเป็นไม่สามารถ เปลี่ยนแปลงผันแปร ไม่อาจเป็นตัวแปรได้แต่จะกลายเป็นค่าคงที่ เป็น constant ที่ ภายหลังการประกาศการมีอยู่ค่าของมันก็จำต้องเป็นอย่างนั้นไปตลอดกาล ดังนั้น ค่าของมันจึงต้องกำหนดไว้อย่างแน่ชัดตั้งแต่ต้นตั้งแต่ตอนประกาศนาม เมื่อไม่สามารถแปรเปลี่ยนได้อีก จึงไม่จำเป็นต้องเก็บไว้ในหน่วยความจำแบบที่ แปรเปลี่ยนได้ volatile memory จึงไม่ใช่ถิ่นที่อยู่ของมันเหมือนตัวแปรอื่น ๆ แต่เก็บไว้ในหน่วยความจำที่มีไว้สำหรับให้อ่านได้อย่างเดียว (read only) จึงรียกท่อน ส่วนนี้ว่า rodata และจัดเก็บไว้ในหน่วยความจำแบบ non-volatile คล้ายกับ text section ในขั้นตอนการโหลดจากคอมพิวเตอร์

ไฟล์วัตถุเมื่อถูกยึดโยงเข้าด้วยกับไฟล์วัตถุอื่น ๆ ให้เป็นไฟล์ที่พร้อมนำไป ดำเนินการ กลุ่มก้อนหรือ section ชื่อเดียวกันของทุกไฟล์จะถูกจัดรวมเข้าไว้ ด้วยกันภายใต้การจัดแบ่งที่ถูกปรับเปลี่ยนมุมมอง จากมุมมองของคำ section ใน ขั้นตอนการทำงานของ linker ผู้ผูกยึดสรรพสิ่งให้เป็นเนื้อแท้หนึ่งเดียวซึ่งทำงานบน คอมพิวเตอร์ผู้สร้างไฟล์สุดท้ายเพื่อผู้อื่นจะได้เอาไปดำเนินการ กลับกลายเป็นคำ segment ในมุมมองของไฟล์ execute ไฟล์ที่แท้จริงซึ่งจะถูกนำไปโหลดใส่ หน่วยความจำของฮาร์ดแวร์ผู้ดำเนินการตามคำสั่งจริง เมื่อเป็นเพียงการเปลี่ยนมุมมอง ชื่อประเภทพื้นฐานของ segment จึงยังคงเป็น text , rodata , data และ bss เช่นเดียวกับเมื่อครั้นยังมองเห็นเป็น section

เมื่อถูกนำไปใส่ในหน่วยความจำของระบบ รอรับการดำเนินการ บาง segment จำเป็นต้องถูกโยกย้ายตำแหน่งก่อนจะลงมือกระทำการได้จริง ความจำเป็นขั้นพื้นฐานคือการโยกย้าย segment ให้ไปอยู่ยังตำแหน่งแห่งหนที่เหมาะสม กับพฤติกรรมในตอนจะดำเนินการจริง segment นั้นคือ data segment กับ bss segment เพราะ segment สองประเภทนี้เก็บตัวแปร ตัวที่สามารถผันแปร ตัวที่ สามารถทั้งถูกอ่านและเขียน ดังนั้นก่อนเริ่มต้นลงมือกระทำการจริง จะต้องทำการ ปรับเปลี่ยนตำแหน่งจากดั้งเดิมที่อยู่ใน non-volatile memory อย่างเช่น flash เปลี่ยนใหม่ไปยัง volatile memory เช่น RAM

สำหรับ data segment เนื่องจากเก็บบรรจุไว้ด้วยตัวแปรที่ถูกให้ค่าตั้งแต่ตอนประกาศตัวแปร ตั้งแต่ขั้นตอนของการคอมไพล์ ซึ่งก็เป็นตั้งแต่ขั้นตอนของการ โหลดมาเก็บไว้ในหน่วยความจำ non-volatile ดังนั้นการโยกย้ายจึงหมายถึงทั้งการกำหนดตำแหน่งที่อยู่และการคัดลอกค่าที่ติดตัวมานั้นไปเก็บไว้ด้วย ขณะที่ bss segment ไม่มีค่าใด ๆ ติดตัวมา ดังนั้นการโยกย้ายจึงเพียงกำหนดตำแหน่งที่อยู่ของตัวแปรต่างๆ ในถูกจัดเรียงอยู่ใน segment ให้สอดคล้องกับตำแหน่งการ จัดเรียงเดิม ไม่จำเป็นต้องทำการคัดลอกค่าใด เพียงแต่ใส่ค่าศูนย์ตั้งต้นไว้ให้ใน ตำแหน่งของหน่วยความจำ volatile ที่ย้ายไปเท่านั้นก็เพียงพอ

“ Si circumstantiae mutentur, qui aeternitatem appetit, inevitabiliter sibi ad condiciones accommodandum est ”

When circumstances change, those who seek perpetuity must adapt unyieldingly”

“ สภาพรายล้อมเปลี่ยน หากปรารถนาดำรงยงยืน ย่อมมิอาจไม่ปรับตาม ”

Naturvirtus

VI Ianuarius MMXXV