鍍金池/ 問答/GO  Linux/ struct 中成員的順序不同,導(dǎo)致內(nèi)存占用不同。那成員類型的定義順序有什么遵守

struct 中成員的順序不同,導(dǎo)致內(nèi)存占用不同。那成員類型的定義順序有什么遵守的原則嗎?

背景:64位操作系統(tǒng)上

示例:定義2個(gè)成員相同的 stuct 對(duì)象(順序不同),打印

package main

import "unsafe"

type A struct {
    X bool
    Y float64
    Z int16
}

type B struct {
    Y float64
    X bool
    Z int16
}

func main() {
    print("A: ")
    println(unsafe.Sizeof(A{}))
    print("B: ")
    println(unsafe.Sizeof(B{}))
}

輸出結(jié)果:

A: 24
B: 16

結(jié)論:
所以在定義 sturct 成員的時(shí)候,隨意的定義可能導(dǎo)致內(nèi)存占用不同。那想問的是在定義時(shí)有什么可參考的嗎?

回答
編輯回答
毀憶

不知道你了解 C 里面的內(nèi)存對(duì)齊不?這里是同樣的道理

因?yàn)槟愕慕Y(jié)構(gòu)了出現(xiàn)了 float64,導(dǎo)致整個(gè)結(jié)構(gòu)里的成員都要以 64 位對(duì)齊(也就是 8 字節(jié))

對(duì)于 A,X Y 和 Z 各占 8 字節(jié),也就是 24 字節(jié)
對(duì)于 B,Y 占 8 字節(jié),而 X 和 Z 能在一個(gè) 8 字節(jié)的空間中放下,所以它們共用 8 字節(jié)

結(jié)論就顯而易見了吧

你可以使用 這個(gè)網(wǎng)站 來查看一個(gè)結(jié)構(gòu)體內(nèi)存布局

2017年11月26日 14:04