The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



"Выпуск языка программирования Rust 1.54"
Версия для распечатки Пред. тема | След. тема
Форум Разговоры, обсуждение новостей
Исходное сообщение [ Отслеживать ]
Присылайте удачные настройки в раздел примеров файлов конфигурации на WIKI.opennet.ru.
. "Выпуск языка программирования Rust 1.54" +1 +/
Сообщение от n00by (ok), 30-Июл-21, 15:41 
Что значит "сбросить стек"?

Вы предполагаете, что структура при возврате из функции куда-то копируется. Значит место (приёмник) зарезервировано в памяти. Для чего указатель стека уменьшается на размер структуры (плюс выравнивание, но это не существенно). Происходит это при определении экземпляра. То есть до вызова функции.

struct foo r;
r = foo_construct();

Далее в теле функции определяется второй экземпляр структуры и как-либо инициализируется.

struct foo
foo_construct()
{
  return (struct foo) { /* ... */ };
}

Локальные переменные живут до выхода из функции. Соответственно, при выполнении return, по-Вашему, необходимо скопировать данные из локального для вызванной функции экземпляра в стек вызывающей.
Представьте, что один из членов структуры инициализирован указателем на неё. Что предпринять в данном случае? Как видим, копирование вообще решением не является.
С другой стороны, если копирование должно быть выполнено до выхода из функции -- значит адрес приёмника каким-то образом в теле функции известен. А раз он известен, то незачем создавать локальную структуру, достаточно формировать результат непосредственно в стековом кадре вызывающей функции. На практике передаётся неявным аргументом указатель (как this в C++), либо функция-конструктор встраивается.

Ответить | Правка | Наверх | Cообщить модератору

Оглавление
Выпуск языка программирования Rust 1.54, opennews, 29-Июл-21, 22:11  [смотреть все]
Форумы | Темы | Пред. тема | След. тема



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру