Почему таблицы свойств объекта содержат размер и выравнивание? - PullRequest
0 голосов
/ 24 августа 2018

Объекты черты Rust - это жирные указатели, которые содержат 2 обычных указателя: на данные и на vtable. Vtable - это структура, содержащая указатель функции деструктора, все указатели метода trait и, наконец, размер и выравнивание данных.

Для чего нужны поля размера и выравнивания?

Я не мог найти много:

  • Сообщение в блоге A : оно предназначено для освобождения памяти, но не используется сегодня, может использоваться некоторыми будущими, более гибкими механизмами (что это может быть? Есть ли еще?)
  • Сообщение в блоге B : оно предназначено для освобождения упакованных значений со стертыми типами, чтобы они знали, как освободить память (Box не хранит местоположение, размер и выравнивание ее распределения? Каждый вариант размера каждый DST не может получить свою собственную версию vtable, не так ли?)

1 Ответ

0 голосов
/ 24 августа 2018

Вот что я нашел до сих пор:

Свойства размера и выравнивания в vtable загружаются в функцию librustc_codegen_llvm::glue::size_and_align_of_dst(), которая возвращает размер и выравнивание типа динамического размера. Для значений ty::Dynamic(..) (внутренний способ описания объектов свойств компилятором) размер и выравнивание считываются из vtable:

match t.sty {
    ty::Dynamic(..) => {
        // load size/align from vtable
        let vtable = info.unwrap();
        (meth::SIZE.get_usize(bx, vtable), meth::ALIGN.get_usize(bx, vtable))
    }
    ...
}

Эта функция, в свою очередь, используется в нескольких местах:

Я не обнаружил места, где эти значения в настоящее время подаются в функцию освобождения Rust (__rust_dealloc()), но они, безусловно, могут быть использованы для этого в будущем.

...