Size: a a a

Compiler Development

2020 July 09

BD

Berkus Decker in Compiler Development
проблем солвед
источник

c

cevek in Compiler Development
Alexander Tchitchigin
A *ptr;
if (rand() > 0.5) {
 Foo *tmp = new Foo();
 ptr = (A *)( (char *)tmp + A_offset_in_Foo );
} else {
 Bar *tmp = new Bar();
 ptr = (A *)( (char *)tmp + A_offset_in_Bar );
}
x(ptr);

Примерно такой.
тогда это конфликтует с этим или я что то не понимаю
источник

VM

Victor Miasnikov in Compiler Development
Berkus Decker
на середину объекта указатели обычно не передают
А в DECWRL Modula-2 ещё и проверяли, чтобы перед "не Си style" фрагментом памяти было записано значение указателя.

"Для ловли bugs"
источник

VK

Val Krylov in Compiler Development
cevek
да больше интересно как это сделано в java или в c#
В них нет множественного наследования, что упрощает.
источник

ВМ

Виталий Медоваров... in Compiler Development
cevek
да больше интересно как это сделано в java или в c#
В C# вместо полей у интерфейса есть свойства, и их в реализации юзер сам обязан пробросить как ему нужно.
В джаве свойств нет. В котлине не знаю как
источник

MS

Mikola Summer Duck in Compiler Development
cevek
тогда это конфликтует с этим или я что то не понимаю
А где тут указатель на середину объекта?
источник

VK

Val Krylov in Compiler Development
Berkus Decker
на середину объекта указатели обычно не передают
Если класс объекта унаследован от классов Base1 и Base2, то Base2* на него будет вести в середину.
источник

ВМ

Виталий Медоваров... in Compiler Development
Val Krylov
Если класс объекта унаследован от классов Base1 и Base2, то Base2* на него будет вести в середину.
Это вроде как имплементейшн специфик и полагаться на то где что будет лежать нельзя
источник

SI

Serghei Iakovlev in Compiler Development
Виталий Медоваров
В C# вместо полей у интерфейса есть свойства, и их в реализации юзер сам обязан пробросить как ему нужно.
В джаве свойств нет. В котлине не знаю как
В Котлине у интерфейсов есть и свойства и методы
источник

ВМ

Виталий Медоваров... in Compiler Development
Мне в котлине нравится ещё делегация для реализации фасадов, удобно
источник

VK

Val Krylov in Compiler Development
Виталий Медоваров
Это вроде как имплементейшн специфик и полагаться на то где что будет лежать нельзя
Но других (практичных) вариантов нет, раскладка какого-то из родительских классов окажется "не с начала" (хотя фокусы вроде [[no_unique_address]] могут приводить и к более интересным последствиям).
источник

AT

Alexander Tchitchigi... in Compiler Development
cevek
да больше интересно как это сделано в java или в c#
В Java я точно знаю, что есть такая штука как объекты классов (это которые достаются через foo.class), очевидно, в объектах лежит указатель на него, вот по ним и проверяется к какому классу относится объект. Ну и прочая рефлексия через них идёт.
В C# наверняка так же сделали. Потому что такую схему ещё в Smalltalk придумали.
источник

ВМ

Виталий Медоваров... in Compiler Development
в C# есть typeof и GetType()
источник

ВМ

Виталий Медоваров... in Compiler Development
возвращают объект типа Type, как ни странно)
источник

AS

Aleksey Shipilev in Compiler Development
Alexander Tchitchigin
В Java я точно знаю, что есть такая штука как объекты классов (это которые достаются через foo.class), очевидно, в объектах лежит указатель на него, вот по ним и проверяется к какому классу относится объект. Ну и прочая рефлексия через них идёт.
В C# наверняка так же сделали. Потому что такую схему ещё в Smalltalk придумали.
источник

AS

Aleksey Shipilev in Compiler Development
А 'foo.class' -- это чисто литерал класса "foo", он отношения к классу конкретного инстанса (который obj.getClass()) не имеет.
источник

AT

Alexander Tchitchigi... in Compiler Development
Aleksey Shipilev
А 'foo.class' -- это чисто литерал класса "foo", он отношения к классу конкретного инстанса (который obj.getClass()) не имеет.
Да, извините, подзабыл немного синтаксис и семантику... 😞
источник

ВМ

Виталий Медоваров... in Compiler Development
вероятно в котлине как раз obj.getClass() и превратится в obj.class :)
источник

AS

Aleksey Shipilev in Compiler Development
Val Krylov
Если класс объекта унаследован от классов Base1 и Base2, то Base2* на него будет вести в середину.
Я так скажу, что упаковщик полей в JVM принципиально может положить поля подкласса в блок, где лежат поля суперкласса, если там есть подходящие дырки. Если бы у рыбы была шерсть (зачёркнуто) интериор-поинтеры, то было бы принципально возможно получить поле класса SubClass, которое лежит по отрицательному оффсету от SubClass* :)
источник

AS

Aleksey Shipilev in Compiler Development
Виталий Медоваров
вероятно в котлине как раз obj.getClass() и превратится в obj.class :)
Так если obj -- неизвестного статически класса, то увы, подменять нечего, надо дожидаться рантайма. А там может инлайнер дотянет какую-нибудь типовую инфу и можно будет getClass() свернуть. Но учитывая, что миррор класса лежит недалеко, даже сам интринзик getClass() довольно просто выглядит, во врезке в https://shipilev.net/jvm/objects-inside-out/#_class_word видно.
источник