Size: a a a

Compiler Development

2020 February 11

AS

Aleksey Shipilev in Compiler Development
Алексей
а GC же должен знать где конкретно лежат рефы в объекте?
Ну да. Во внутренеем описании класса есть инфа от упаковщика, где разложены референсные поля.
источник

А

Алексей in Compiler Development
в идеале наверное стоит эту инфу свести к одному числу
источник

E

EgorBo in Compiler Development
источник

E

EgorBo in Compiler Development
а не, не первое поле оказывается :)
источник

E

EgorBo in Compiler Development
но на скрине видно как работает упаковщик
источник

AS

Aleksey Shipilev in Compiler Development
Nikolay
А зачем тогда выравнивать объекты по 8 байтов , если мы и так каждое поле равняем
Вы думаете, наверное, что поле "равняется" по абсолютному адресу. Но нет же, у упаковщика задача "разложить поля по оффсетам внутри объекта так, чтобы любой доступ к любому полю после любой аллокации любого объекта был выравнен". Нужно и оффсет выравнять, и внешним выравниванием обеспечить, чтоб внутренее выравнивание не сломалось.
источник

А

Алексей in Compiler Development
а DateTime - это структура, да?
источник

E

EgorBo in Compiler Development
Алексей
а DateTime - это структура, да?
да
источник

AS

Aleksey Shipilev in Compiler Development
EgorBo
но на скрине видно как работает упаковщик
У меня целый тул есть :) https://openjdk.java.net/projects/code-tools/jol/
источник

А

Алексей in Compiler Development
EgorBo
да
правда тогда не совсем понятно почему long идёт первым, а уж только потом строка
источник

AS

Aleksey Shipilev in Compiler Development
Самая песня начинается, когда несколько классов в иерархии есть, и в суперклассе есть дырки-кандидаты :)
источник

E

EgorBo in Compiler Development
а ну у меня на скрине чья-то либка, причем что-то в ней не так, почему-то она поинтер в методтейбл отображает в 4 байта, как будто х86
источник

AS

Aleksey Shipilev in Compiler Development
EgorBo
а ну у меня на скрине чья-то либка, причем что-то в ней не так, почему-то она поинтер в методтейбл отображает в 4 байта, как будто х86
А в методтейбл прямо нативный поинтер, то есть 8 байт? И оффсеты полей начинаются с нуля: у вас в рантайме ссылка на объект -- это внутренний указатель (т.е. заголовок "лежит" на минусовом оффсете)?
источник

E

EgorBo in Compiler Development
Aleksey Shipilev
А в методтейбл прямо нативный поинтер, то есть 8 байт? И оффсеты полей начинаются с нуля: у вас в рантайме ссылка на объект -- это внутренний указатель (т.е. заголовок "лежит" на минусовом оффсете)?
ага всё так
источник

E

EgorBo in Compiler Development
в хедере еще много всяких контрольных битиков
источник

AS

Aleksey Shipilev in Compiler Development
Казалось бы, для GC надо быстрый доступ к заголовку, даже если полей нет, и лишние приседания в потоке инструкций ни к чему :)
источник

E

EgorBo in Compiler Development
не буду спорить, не специалист по гц.

зато операция взятие указателя от чего угодно быстрая и можно пинвокаться
источник

AS

Aleksey Shipilev in Compiler Development
Я вообще напрягаюсь от отрицательных оффсетов, чуть недоглядел, и нннннаааа тебе иммидеэйт вида 0xffffffffffffffffffff.
источник

E

EgorBo in Compiler Development
но я на самом деле реально по гц профан так что возможно сморозил глупость, но термин интериор поинтер часто то тут то там звучит
источник

E

EgorBo in Compiler Development
@shipilev более того массивы - спешал кейс, у них еще больше инфы по отрицательному оффсету - длина и дименшны
источник