GOLANG_GOOGLE Telegram 2928
πŸ“¦ Как ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ 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



tgoop.com/Golang_google/2928
Create:
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

View MORE
Open in Telegram


Telegram News

Date: |

Telegram iOS app: In the β€œChats” tab, click the new message icon in the right upper corner. Select β€œNew Channel.” The public channel had more than 109,000 subscribers, Judge Hui said. Ng had the power to remove or amend the messages in the channel, but he β€œallowed them to exist.” Telegram channels enable users to broadcast messages to multiple users simultaneously. Like on social media, users need to subscribe to your channel to get access to your content published by one or more administrators. End-to-end encryption is an important feature in messaging, as it's the first step in protecting users from surveillance. bank east asia october 20 kowloon
from us


Telegram Golang
FROM American