วันนี้น้องในทีมมาถามเรื่อง 
การใช้งาน memory ของ struct ในภาษา Go
ซึ่งมีเรื่องของ Alignment และ Padding ที่อาจจะดูงง ๆ
เลยลองไปเปิดเอกสารของภาษา Go ดูกันหน่อย
ได้ความว่า

ลำดับของ property ใน Struct

มีผลต่อขนาดของ memory ที่ใช้งานด้วย
ซึ่งถ้าเราจัดการดี ๆ หรือมีความเข้าใจดี ๆ แล้ว
ก็จะช่วยทำให้ระบบงานของเราใช้ memory น้อยลงไปด้วย
น่าจะมีประโยชน์พอสมควรเลย
ปล. ใช้งานบน Architecture แบบ 64 bit

เริ่มด้วย code ประมาณนี้

ผลที่ได้คือ Struct นั้นจะใช้หน่วยความจำไป 24 byte

ทำไมถึงใช้ถึง 24 byte ?
เนื่องจากลองบวกขนาดของ data type ใน struct แล้วไม่ถึงนะ
คือ 1 + 8 + 4 =  13 byte เท่านั้น !!!

เมื่อลองไปอ่านเอกสารดูพบว่า

แต่ละตัวแปรใน Struct นั้น (สำหรับ Architecture แบบ 64 bit)
จะทำการ padding ทุก ๆ  8 byte เสมอ
ทำให้ผลรวมของการจองหน่วนความจำคือ 24 byte นั่นเอง
ทำให้การจองพื้นที่ในหน่วยความจำเป็นดังนี้

จะเห็นว่าตัวแปรชนิด float64 จะใช้พื้นที่ขนาด 8 byte
ซึ่งใหญ่กว่าที่มีให้หลังจากที่ boolean ในไป 1 byte
ทำให้ต้องไปจองเพิ่มอีก 8 byte ตามรูปแบบการจองหน่วยความจำ (Allocate memory)

คำถามคือ จะลดขนาดของหน่วยความจำที่ใช้ลงไปอย่างไร ?

ง่าย ๆ คือ เปลี่ยนลำดับของ property ใน Struct ไงละ !!
ยกตัวอย่างเช่น จะเหลือเพียง 16 byte เท่านั้น

แสดงดังรูป

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

Reference Websites