hugga
@hugga

Как провести эскейп анализ?

Мне интересно, не утекает ли память при такой конструкции:
У меня есть функция, которая растеризует прямую линию между двумя заданными точками (r0, c0)-(r1, c1), также принимая указатель на буфер, в который записываются координаты ( type point struct{ r, c int}). Возвращает буфер (не указатель). В теле функции он обычно разростается до определенного порога элементов через append.

func line(r0, c0, r1, c1 int, buffer *[]point) []point {
    *buffer = (*buffer)[:0]
    ...
    *buffer = append(*buffer, point{ ... })
    ...
    return *buffer
}


Так вот, если посмотреть на адреса входящего и выходящего слайса, то они закономерно изменяются (до опр. порога). Но меня интересует, как компилятор воспринимает такую конструкцию и нет ли утечек памяти?

UPD: Перефразирую вопрос. Не ускальзывают ли предшествующие слайсы (которые малого размера) в кучу и не теряются ли там. Т.к. буфер заменяется в результате роста элементов и слайсы выводятся из ф-ции для дальнейшего использования в общую область видимости.
  • Вопрос задан
  • 80 просмотров
Пригласить эксперта
Ответы на вопрос 1
"Утечка памяти" — это некорректный термин здесь. Скорее всего вы хотите, чтобы было поменьше аллокаций, соответственно, больше производительность.
1. Лучше слайс на вход передавать не указателем. Если слайс нужно изменять внутри функции, то хорошей практикой будет просто возвращать измененный слайс.
2. Если у вас там много append-ов, то надо не забывать заранее аллоцировать внутри слайса место под эти аппенды, если известно их количество.
Например, если знаете, что точек в буфере будет 20, то делайте: buffer = make([]point,0,20)
3. Всегда можно сравнить несколько разных реализаций путем написания бенчмарков. https://scene-si.org/2017/06/06/benchmarking-go-pr...
Если будете использовать ReportAllocs, то как раз увидите, в каком варианте у вас больше аллокаций.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Waves Enterprise Москва
от 200 000 ₽
SpectrumData Екатеринбург
от 150 000 до 250 000 ₽
Lanck Telecom Санкт-Петербург
от 180 000 до 300 000 ₽