The OpenNET Project / Index page

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



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

Короче пушим дворды и зовём функу потом попаем. Это называется сидекл. В стдкол функа сама попает ретн. А в фастколе параметры в регистрах. :)

> Указатель стека нужно возвращать/сбрасывать дабы он не вышел за границы стека, ведь
> проверки границ стека как и массива не предусмотрено, разве что проц
> выкинет исключение на стек и Ояс завершит программу в отличии от
> массива

Верно. Но это не главное. Допустим, перед вызовом подпрограммы по адресу [rsp - 8] что-то сохранили. Подпрограмма изменила указатель стека, отработала, произошёл возврат. В rsp другое значение, и по [rsp - 8] прочитали мусор. Так до переполнения дело не дойдёт.

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

Так я и не спорю.

> Ясно что можно передавать структуру по указателю, мы же говорили про накладные
> расходы при передаче по значению

Я говорю только по поводу возврата структур https://www.opennet.ru/openforum/vsluhforumID3/124921.html#249
то есть отвечал вот на это:
> В общем то Си разрешает функциям возращать структуры, но это просто офигительные
> дополнительные расходы на копирование

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

При возврате нет смысла создавать копию.

> Насчет конструктуров и стековых фреймов чет не понял...

Конструктором я назвал функцию, которая возвращает структуру, что бы меньше писать.

Про фреймы просто надо подумать, как в ассемблере будет выглядеть сишный псевдокод из исходного объяснения https://www.opennet.ru/openforum/vsluhforumID3/124921.html#348

Вот как оно описано в "System V Application Binary Interface AMD64 Architecture Processor Supplement"

The returning of values is done according to the following algorithm:

2. If the type has class MEMORY, then the caller provides space for the return
value and passes the address of this storage in %rdi as if it were the first
argument to the function. In effect, this address becomes a “hidden” first ar-
gument. This storage must not overlap any data visible to the callee through
other names than this argument.
On return %rax will contain the address that has been passed in by the
caller in %rdi.

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

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



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

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