Что идет в стеке, а что в куче в Rust? - PullRequest
0 голосов
/ 02 октября 2018

Я действительно запутался в системе выделения памяти в Rust.

В Java вы используете new для выделения памяти в куче.В C вы используете malloc(), все остальное идет в стек.

Я думал, что в Rust Box<T> выделяет память в куче, но после прочтения раздела «Определение нашего собственного умного указателя» вглава 15.2 в языке программирования Rust похоже, что MyBox<T> не имеет какой-либо специальной аннотации, чтобы сделать значение T живым в куче.

  1. Что именно идет в стек, а что в кучу?

  2. Является ли реализация MyBox<T> практически такой же, как Box<T>?

  3. Если реализации идентичны, что делает T хранящимся в куче, а не в стеке?

  4. Если реализации не идентичны, что делает Box<T> выделить память на кучу?

1 Ответ

0 голосов
/ 03 октября 2018
  1. Сложно сказать.Обычно Rust избегает размещения чего-либо в куче.Никогда компилятор не будет выполнять неявное распределение в куче, но библиотечные функции могут сделать это за вас.По крайней мере все, что имеет динамический размер (например, Vec<T>), будет нуждаться в чем-то в куче под капотом, в остальном, в документации должна быть подсказка.

    Обратите внимание, что даже в C многие функции могут выполнятьвыделение кучи без явного вызова malloc.Например.Недавно мне пришлось отлаживать утечку памяти, когда разработчик назвал getaddrinfo без соответствующего freeaddrinfo, игнорируя, что эта функция выделяет память в куче.Этот класс ошибок должен быть действительно редким в Rust, однако, благодаря RAII .

  2. Совсем нет!Книга упрощает вещи здесь, чтобы избежать деталей, не важных для этого раздела.

  3. -

  4. Box - встроенный компилятор.Под капотом, который выделяет память, находится распределитель, определенный как в liballoc.Вы можете думать об этом распределителе как обеспечивающем malloc -подобную функциональность.На практике распределитель по умолчанию использует jemalloc на большинстве целей, также можно использовать пользовательский распределитель, например, alloc_system ящик использует системный malloc / realloc / free функции для построения своего распределителя.

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