Vladimir
тогда, почему trait Trait { } impl Trait for u8 {} trait SomeSized: Sized {} impl SomeSized for Trait {} fn main() { }
Vladimir
не работает?
Vladimir
`Trait + 'static does not have a constant size known at compile-time`
Евгений
Vladimir
но, внезапно impl<'a> SomeSized for &'a Trait {}
Vladimir
работает
Loyd
https://play.rust-lang.org/?gist=e3df41734fd1d8f6c02d736418bf9de5&version=stable
Евгений
Ты опять ссылку пихаешь
Евгений
Так можно доказать, что str sized 😆
Vladimir
Х)
Loyd
Ты опять ссылку пихаешь
Ау, там и trait-object и pointer to trait-object
Loyd
Так, может мы о разных вещах говорим
Евгений
Нет, там pointer to trait object и pointer to pointer
Евгений
&str и &&str
Loyd
trait-object это, как в std struct A { data: *, vtable: * }
Loyd
И вот это 16 байт
Loyd
Согласен?
Loyd
А, таки в https://doc.rust-lang.org/1.21.0/core/raw/struct.TraitObject.html всё расписано
Loyd
Лол. В первом абзаце доказательство второго слива @c_vld, а во втором — первого
Loyd
Полтора часа насмарку
Vladimir
Окей х)
Loyd
Слушайте, а кто-нибудь знает, как в компиляторе гарантируется, что вот эти все raw (raw slice, raw traitobject) точно соответствуют внутряхам? Что компилятор не заоптимизировал какой-то из них (layout-то не зафиксирован)?
big
Слушайте, а кто-нибудь знает, как в компиляторе гарантируется, что вот эти все raw (raw slice, raw traitobject) точно соответствуют внутряхам? Что компилятор не заоптимизировал какой-то из них (layout-то не зафиксирован)?
это интересный вопрос. Я вот до этого момента думал что компилятор при каждой возможности заоптимизирует их. Ведь при инлайне вызова обьекта с аргументом trait object'а vtable ведь константа. Получается вместо indirect вызовов можно подставить прямые, а это в свою очередь означает что можно заинлайнить и эти вызовы... Золотая жила!
big
С другой стороны, там сказано ниже, что нельзя подставлять другой vtable = UB, так что хз
Loyd
есть пример?
https://play.rust-lang.org/?gist=ca8594e0afaf70d5c04018da33aadc84&version=undefined
Loyd
есть пример?
Веселее пример, с тем, что foo может быть и модулем и функцией одновременно (просто потому, что неймспейсы разные)
big
Наверное потому и сказано
тогда получается так, что нужно всегда передавать vtable, даже если он не используется (все заинлайнено), только потому что какой-нибудь умник его может за transmute'ить?
Loyd
Так нет же. Если в vtable будут ссылки не на те функции, то это UB
Loyd
Значит, компилятор может полагаться на то, что там всегда одни и те же функции
Loyd
И может заоптимизировать
big
Я не совсем об этом
Loyd
(а вот в конец vtable вполне напихать что-то можно)
Loyd
Я про то, что в месте, выделенном под vtable может ещё что-то быть )
Loyd
Я не совсем об этом
А, ну указатель на vtable всегда передаётся, да
Loyd
Что забавно, согласен
big
надо бы проверить все эти предположения
big
первое предположение могу подтвердить: rust способен заинлайнить вызовы к trait object переданному через аргумент.
big
А, ну указатель на vtable всегда передаётся, да
лол! Нет, на самом деле не передается )
big
логика простая, зачем ему передаваться, если наши рассуждения основываются на том, что этот vtable константный ))
big
зачем передавать константу ) Сейчас все покажу
big
https://godbolt.org/g/Khgahx вот здесь все наглядно видно
big
Потому что кто-то может интроспектить внутри
ну если кому-то это понадобится он и получит констату
Loyd
Да-да, я уже понял )
Vladimir
пздц
Да просто в расте нет "биндинга" и формально тут всё явно.
big
забавно, зачем в vtable два .quad 4
Vladimir
Тайпаалинг, и размер?
big
о размер, а что есть typealias?
big
типа type_id?
Vladimir
Алинг, то автокоррекция
Vladimir
Выравнивание
big
а, имеет смысл )
big
подтверждаю
Vladimir
Тайпаайди появится только если будет +Any
Vladimir
Поидее
big
угу
Vlad
400 сообщений. Я уж думал опять какой-то оффтоп. Ан нет, трейтобжекты обсуждаем. ОК
Маjко
Праздник прям какой-то
Serg
Немного Haxe подкину https://dou.ua/lenta/articles/what-is-haxe
Serg
О чем вообще речь? Haxe — это open source инструмент (toolkit) для разработки кроссплатформенного ПО, в основе которого лежат такие вещи как: Сам язык Haxe со строгой типизацией (но для любителей динамики есть возможность писать динамический код!). Быстрый и современный компилятор. Стандартная, кроссплатформенная библиотека и доступ к нативным функциям всех поддерживаемых платформ. Сильная сторона языка Haxe в том, что он в большинстве случаев не компилируется, а транслируется в другие языки. Хотя в официальной документации и используется термин «compiler», правильнее было бы назвать его «transcompiler». Для простоты понимания я буду называть его транслятором. В чем же тут сильная сторона, спросите вы? В обилии целевых платформ, список которых постепенно увеличивается: JavaScript, C#, C++, Java, PHP (включая PHP7), Python, ActionScript 3, Lua, а также загадочные Neko и HashLink.
Alex
haxe это который типизированный flash?
Serg
походу типо того
Anonymous
а зачем он здесь
Евгений
o.o
Евгений
Не слышал про haxe уже лет 10
Евгений
Я думал он сдох вместе с флешем
Serg
нашли свою нишу
Alex
перепрофилировался под пхп видать
Serg
Зачем оно тут нужно?
вдруг кто-то захочет еще биндинг для раст сделать, мало ли извращенцев
Safort
вдруг кто-то захочет еще биндинг для раст сделать, мало ли извращенцев
С таким же успехом можно сюда что угодно вбрасывать, вдруг кто-то захочет с этим что-то сделать на расте.
Anonymous
https://golang.org