The OpenNET Project / Index page

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



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

"Восстановить" вместо "сбросить" было бы понятнее. Вернуть значение указателя нужно, что бы можно было дальше обращаться к своим локальным переменным. А то до переполнения дело не дойдёт.)

Единственно что, в зависимости от конвенции вызова, аргументы (если таковые были переданы через стек) могут быть оставлены на стеке (cdecl) или сняты вызывающей стороной (ctdcall). То есть при выходе из подпрограммы вершине стека не обязательно сразу же вернётся прежнее значение.

> ... ну смотри ты говоришь что во время return локальные переменные копируются
> в стек вызываемой функции...

Я говорю, что копирование вообще неправильно (почему -- подробнее можно почитать про глубокое копирование в С++). Но если бы оно было, то там ему самое место.

> только вот стек общий на всю программу(можешь
> себе представить стек разделяемой памятью фиксированного размера)

Стек общий, но у меня говорится о стековых кадрах. То есть об областях стека, где подпрограммы хранят свои локальные переменные. Дословно: достаточно формировать результат непосредственно в стековом кадре вызывающей функции.

По поводу разделяемой памяти - в моём понимании это страницы ОЗУ, которые принадлежат различным адресным пространствам (процессам). Стека в такой памяти быть не должно.

> Отсюда ты и говоришь про некий адрес приемника... там адреса не нужны
> это или регистры или стек которые заранее известны

Если возвращающая структуру функция (назовём её конструктором) вызывается из одного места, тогда строение стекового кадра вызывающей стороны действительно известно и однозначно, можно не передавать адрес для сохранения результата. Но в таком случае конструктор скорее всего окажется встроен (inline).

Если же вызывается из разных мест, или для массива структур, то придётся передавать адрес конструктору. И этот же адрес потребовался бы, если бы пришлось копировать структуры.

> Локальной памяти не существует(она хранится в стеке), название неправильное, оно не отражает
> ее природу, в отличии от определения автоматической памяти

Как раз вместо "автоматической памяти" в стандарте языка Си определено время жизни объектов (аutomatic storage duration). И опять же, у меня "локальные переменные". Кадр стека локален для каждого вхождения в подпрограмму, поскольку обращение к нему происходит относительно регистра стека.

> Короче суть такова что стек один на всех, а не укаждого свой

Вот именно. Потому, предприняв меры (передав указатель на место под результат), можно создавать структуру сразу в нужном месте и без копирования.

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

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



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

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