GO_INTERVIEW_LIB Telegram 519
💬 Срезы в Go всегда аллоцируются в куче?

Срезы состоят из двух частей: заголовка среза (который представляет собой структуру с тремя полями) и базового массива, который может находиться либо на стеке, либо в куче.

1. Первый случай: и срез, и базовый массив находятся на стеке.

func doSomething() {
a := byte(1)
println("a's address:", &a)

s := make([]byte, 1)
println("slice's address:", &s)
println("underlying array's address:", s)
}


Вывод примера показывает, что и переменная a, и срез s, и его базовый массив выделяются на стеке, их адреса близки. Go может оптимизировать это размещение, так как размер массива известен во время компиляции.

2. Базовый массив начинается на стеке, затем перемещается в кучу.

func main() {
slice := make([]int, 0, 3)
println("slice:", slice, "- slice addr:", &slice)

slice = append(slice, 1, 2, 3)
println("slice full cap:", slice)

slice = append(slice, 4)
println("slice after exceed cap:", slice)
}


В этом случае адрес базового массива меняется, когда срез превышает свою емкость. Это означает, что массив теперь находится в куче.

3. Базовый массив сразу выделяется в куче.

Если емкость среза больше 64 КБ, базовый массив будет выделен в куче, как видно в следующем примере:

func main() {
sliceA := make([]int, 64 * 1024)
sliceB := make([]int, 64 * 1024 + 1)
println("sliceA:", sliceA)
println("sliceB:", sliceB)
}


В результате массив для sliceA находится на стеке, а для sliceB — в куче.

🤔 Как избежать выделения памяти в куче?

Лучший способ — заранее оценить необходимую емкость среза, используя make() с установленной емкостью. Это уменьшит вероятность дополнительных выделений памяти. Также можно использовать sync.Pool для повторного использования массивов.
8👍6🔥2



tgoop.com/go_interview_lib/519
Create:
Last Update:

💬 Срезы в Go всегда аллоцируются в куче?

Срезы состоят из двух частей: заголовка среза (который представляет собой структуру с тремя полями) и базового массива, который может находиться либо на стеке, либо в куче.

1. Первый случай: и срез, и базовый массив находятся на стеке.

func doSomething() {
a := byte(1)
println("a's address:", &a)

s := make([]byte, 1)
println("slice's address:", &s)
println("underlying array's address:", s)
}


Вывод примера показывает, что и переменная a, и срез s, и его базовый массив выделяются на стеке, их адреса близки. Go может оптимизировать это размещение, так как размер массива известен во время компиляции.

2. Базовый массив начинается на стеке, затем перемещается в кучу.

func main() {
slice := make([]int, 0, 3)
println("slice:", slice, "- slice addr:", &slice)

slice = append(slice, 1, 2, 3)
println("slice full cap:", slice)

slice = append(slice, 4)
println("slice after exceed cap:", slice)
}


В этом случае адрес базового массива меняется, когда срез превышает свою емкость. Это означает, что массив теперь находится в куче.

3. Базовый массив сразу выделяется в куче.

Если емкость среза больше 64 КБ, базовый массив будет выделен в куче, как видно в следующем примере:

func main() {
sliceA := make([]int, 64 * 1024)
sliceB := make([]int, 64 * 1024 + 1)
println("sliceA:", sliceA)
println("sliceB:", sliceB)
}


В результате массив для sliceA находится на стеке, а для sliceB — в куче.

🤔 Как избежать выделения памяти в куче?

Лучший способ — заранее оценить необходимую емкость среза, используя make() с установленной емкостью. Это уменьшит вероятность дополнительных выделений памяти. Также можно использовать sync.Pool для повторного использования массивов.

BY Библиотека Go для собеса | вопросы с собеседований


Share with your friend now:
tgoop.com/go_interview_lib/519

View MORE
Open in Telegram


Telegram News

Date: |

The court said the defendant had also incited people to commit public nuisance, with messages calling on them to take part in rallies and demonstrations including at Hong Kong International Airport, to block roads and to paralyse the public transportation system. Various forms of protest promoted on the messaging platform included general strikes, lunchtime protests and silent sit-ins. As five out of seven counts were serious, Hui sentenced Ng to six years and six months in jail. Ng Man-ho, a 27-year-old computer technician, was convicted last month of seven counts of incitement charges after he made use of the 100,000-member Chinese-language channel that he runs and manages to post "seditious messages," which had been shut down since August 2020. How to Create a Private or Public Channel on Telegram? Members can post their voice notes of themselves screaming. Interestingly, the group doesn’t allow to post anything else which might lead to an instant ban. As of now, there are more than 330 members in the group.
from us


Telegram Библиотека Go для собеса | вопросы с собеседований
FROM American