Разница в указателях между Go и C ++, изменится ли указатель после gc? - PullRequest
0 голосов
/ 20 мая 2019

Есть ли разница в том, как работают указатели в Go и C ++, будут ли указатели изменяться после gc?

Я хочу знать конкретные отношения между указателями и памятью в Go. Если у вас есть соответствующая информация или пояснения к исходному коду, большое спасибо.

1 Ответ

0 голосов
/ 22 мая 2019

В спецификации языка ничего не сказано, должны ли указатели оставаться неизменными. Это означает, что вы не должны полагаться на это или опираться на него.

У вас есть гарантия того, что если указатели изменятся после цикла сборки мусора или если среда выполнения изменит их из-за выделения / освобождения памяти, указатели в ваших переменных будут обновлены, чтобы отразить изменения.

В документации unsafe.Pointer есть подсказка , указатели могут изменить:

uintptr - это целое число, а не ссылка. Преобразование указателя в uintptr создает целочисленное значение без семантики указателя. Даже если uintptr содержит адрес какого-либо объекта, сборщик мусора не будет обновлять значение этого uintptr, если объект перемещается , и при этом uintptr не будет препятствовать тому, чтобы объект был возвращен.

На практике сборщик мусора не будет постоянно менять указатели, это было бы ненужными накладными расходами. Но он может переупорядочить объекты в памяти, если многие из них освобождаются и сжимают память, или существует «давление» для освобождения неиспользуемой памяти (например, из-за вызова debug.FreeOSMemory()).

...