tgoop.com/Golang_google/2928
Last Update:
π¦ ΠΠ°ΠΊ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ struct Π² Go: Π²ΡΡΠ°Π²Π½ΠΈΠ²Π°Π½ΠΈΠ΅, ΠΏΠ°Π΄Π΄ΠΈΠ½Π³ ΠΈ ΠΏΠΎΡΡΠ΄ΠΎΠΊ ΠΏΠΎΠ»Π΅ΠΉ
ΠΠΎΠ³Π΄Π° ΡΡ ΡΠ°Π±ΠΎΡΠ°Π΅ΡΡ Ρ Go ΠΈ ΡΡΡΡΠΊΡΡΡΠΎΠΉ Π΄Π°Π½Π½ΡΡ
(`struct`), ΠΏΠΎΡΡΠ΄ΠΎΠΊ ΠΏΠΎΠ»Π΅ΠΉ β ΡΡΠΎ Π½Π΅ ΠΏΡΠΎΡΡΠΎ ΡΡΡΠ΅ΡΠΈΠΊΠ°. ΠΡΠΎ Π½Π°ΠΏΡΡΠΌΡΡ Π²Π»ΠΈΡΠ΅Ρ Π½Π°:
β’ ΡΠ°Π·ΠΌΠ΅Ρ Π·Π°Π½ΠΈΠΌΠ°Π΅ΠΌΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ
β’ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΊΡΡΠ°
β’ ΠΈ Π² ΠΈΡΠΎΠ³Π΅ β Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΡΠ²ΠΎΠ΅ΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ.
ΠΠ²ΡΠΎΡ [buarki Π½Π° DEV.to](https://dev.to/buarki/optimizing-struct-layout-and-padding-in-practice-23p1) ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ, ΠΊΠ°ΠΊ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ Π²ΡΡΡΡΠ°ΠΈΠ²Π°ΡΡ ΠΏΠΎΠ»Ρ Π² ΡΡΡΡΠΊΡΡΡΠ°Ρ
, ΡΡΠΎΠ±Ρ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ Π»ΠΈΡΠ½Π΅Π³ΠΎ ΠΏΠ°Π΄Π΄ΠΈΠ½Π³Π° ΠΈ ΡΠ΄Π΅Π»Π°ΡΡ struct Π±ΠΎΠ»Π΅Π΅ ΠΊΠΎΠΌΠΏΠ°ΠΊΡΠ½ΡΠΌ ΠΈ Π±ΡΡΡΡΡΠΌ.
π Π§ΡΠΎ ΡΠ°ΠΊΠΎΠ΅ padding?
Go Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Π²ΡΡΠ°Π²Π½ΠΈΠ²Π°Π΅Ρ ΠΏΠΎΠ»Ρ ΡΡΡΡΠΊΡΡΡ ΠΏΠΎ ΠΈΡ
ΡΠ°Π·ΠΌΠ΅ΡΡ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ:
type Bad struct {
a bool // 1 Π±Π°ΠΉΡ
b int64 // 8 Π±Π°ΠΉΡ
c bool // 1 Π±Π°ΠΉΡ
}
ΠΠ°ΠΆΠ΅ΡΡΡ, ΡΡΠΎ struct Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π°Π½ΠΈΠΌΠ°ΡΡ 10 Π±Π°ΠΉΡ. ΠΠΎ ΠΈΠ·-Π·Π° Π²ΡΡΠ°Π²Π½ΠΈΠ²Π°Π½ΠΈΡ Go Π²ΡΡΠ°Π²ΠΈΡ ΠΏΠ°Π΄Π΄ΠΈΠ½Π³, ΠΈ ΠΈΡΠΎΠ³ΠΎΠ²ΡΠΉ ΡΠ°Π·ΠΌΠ΅Ρ ΠΎΠΊΠ°ΠΆΠ΅ΡΡΡ 24 Π±Π°ΠΉΡΠ°.
β ΠΠ°ΠΊ ΡΡΠΎ ΠΈΡΠΏΡΠ°Π²ΠΈΡΡ?
ΠΠ΅Π½ΡΠ΅ΠΌ ΠΏΠΎΡΡΠ΄ΠΎΠΊ ΠΏΠΎΠ»Π΅ΠΉ:
type Good struct {
b int64 // 8 Π±Π°ΠΉΡ
a bool // 1 Π±Π°ΠΉΡ
c bool // 1 Π±Π°ΠΉΡ
}
Π’Π΅ΠΏΠ΅ΡΡ ΡΡΡΡΠΊΡΡΡΠ° Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ 16 Π±Π°ΠΉΡ, Π° Π½Π΅ 24 β ΠΈ Π²ΡΡ Π±Π»Π°Π³ΠΎΠ΄Π°ΡΡ Π³ΡΠ°ΠΌΠΎΡΠ½ΠΎΠΌΡ ΡΠ°Π·ΠΌΠ΅ΡΠ΅Π½ΠΈΡ ΠΏΠΎΠ»Π΅ΠΉ.
π Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°ΡΠΈΠΈ:
β’ Π‘ΠΎΡΡΠΈΡΡΠΉ ΠΏΠΎΠ»Ρ ΠΎΡ ΡΠ°ΠΌΡΡ ΠΊΡΡΠΏΠ½ΡΡ ΠΊ ΡΠ°ΠΌΡΠΌ ΠΌΠ΅Π»ΠΊΠΈΠΌ
β’ ΠΡΡΠΏΠΏΠΈΡΡΠΉ ΠΎΠ΄Π½ΠΎΡΠΈΠΏΠ½ΡΠ΅ ΠΏΠΎΠ»Ρ
β’ ΠΠ·Π±Π΅Π³Π°ΠΉ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠΈΠ²Π°Π½ΠΈΡ
bool`/`byte
Ρ int64`/`float64
β’ ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉ Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, viztruct) Π΄Π»Ρ Π°Π½Π°Π»ΠΈΠ·Π° struct'ΠΎΠ²
β’ ΠΡΠΎΠ²Π΅ΡΡΠΉ ΡΠ°Π·ΠΌΠ΅Ρ struct ΡΠ΅ΡΠ΅Π·
unsafe.Sizeof()
π― ΠΡΠΎ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ Π²Π°ΠΆΠ½ΠΎ ΠΏΡΠΈ:
β’ ΠΌΠ°ΡΡΠΎΠ²ΠΎΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ struct Π² ΠΌΠ°ΡΡΠΈΠ²Π°Ρ ΠΈ ΡΠ»Π°ΠΉΡΠ°Ρ
β’ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ΅ struct ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΠΎΡΠΎΠΊΠ°ΠΌΠΈ
β’ ΡΠ°Π±ΠΎΡΠ΅ Ρ Π±ΠΈΠ½Π°ΡΠ½ΡΠΌΠΈ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π°ΠΌΠΈ ΠΈΠ»ΠΈ mmap
π ΠΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅ Ρ ΠΏΡΠΈΠΌΠ΅ΡΠ°ΠΌΠΈ: https://dev.to/buarki/optimizing-struct-layout-and-padding-in-practice-23p1
BY Golang

Share with your friend now:
tgoop.com/Golang_google/2928