Как Rust хранит типы во время выполнения? - PullRequest
3 голосов
/ 25 сентября 2019

A u32 занимает 4 байта памяти, String занимает 3 целых числа размером с указатель (для местоположения, размера и зарезервированного пространства) в стеке, плюс некоторое количество в куче.

Для меня это означает, что Rust не знает, когда код выполняется, какой тип хранится в определенном месте, потому что это знание потребует больше памяти.

Но в то же время ему это не нужноузнать, какой тип хранится в 0xfa3d2f10, чтобы иметь возможность интерпретировать байты в этом месте?Например, знать, что следующие байты формируют спецификацию String в куче?

1 Ответ

8 голосов
/ 25 сентября 2019

Как Rust хранит типы во время выполнения?

Обычно нет.

Rust не знает, когда выполняется кодкакой тип хранится в определенном месте

Правильно.

не нужно ли знать, какой тип хранится

Нет,байты в памяти должны быть правильными, а остальная часть кода предполагает столько же.Смещения полей в структуре заполняются сгенерированным машинным кодом.

Когда Rust хранит что-то как информация о типе?

При выполнении динамической диспетчеризации, указатель жира используется.Он состоит из указателя на данные и указателя на vtable , набор функций, которые составляют рассматриваемый интерфейс.Vtable может рассматриваться как представление типа, но в нем не так много информации, которая, как вы думаете, входит в «тип» (если черта этого не требует).Динамическая диспетчеризация не очень распространена в Rust, так как большинство людей предпочитают статическую диспетчеризацию, когда это возможно, но оба метода имеют свои преимущества.

Есть также такие понятия, как TypeId, которые могут представлять однуопределенный тип, но только из подмножества типов.Это также не дает много возможностей, кроме того, «это один тип или нет».

Разве это не ужасно хрупко?

Да, это может бытьЭто одна из вещей, которая делает Rust таким интересным.

В таких языках, как C или C ++, не так уж много защищает программиста от глупых ошибок, которые выходят из-под контроля и путают эти байты, плавающие в памяти,Эти ошибки приводят к ошибкам из-за безопасности памяти.Вместо того, чтобы интерпретировать ваш пароль как пароль, он интерпретируется как ваше имя пользователя и распечатывается для злоумышленника (упс!)но все же все сделано во время компиляции. Небезопасно Rust позволяет использовать эти опасные инструменты в обмен на то, что теперь программист должен поддерживать все гарантии, как если бы они снова писали на C или C ++.

См. Также:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...