Re[5]: Насколько корректно использовать адрес переменной в стеке
От: Nick-77  
Дата: 26.07.17 13:20
Оценка:
Здравствуйте, watchmaker, Вы писали:

W>Здравствуйте, Кодт, Вы писали:


К>>Возврат значения — это и есть немного подержать стек


К>>Альтернативное решение — передать буфер в функцию, как параметр. В том числе, как дефолтный параметр, но там придётся повыкручиваться.

К>>http://ideone.com/MTulkq
К>>Я не сторонник такого трюкачества, но вдруг пригодится.

W>Честно говоря, если прочитать например SystemV ABI, то можно увидеть, что это автоматически происходит для всех структур (размер которых больше некоторого порогового значения).

W>То есть всё это извращение с передачей дефолтного параметра не нужно. Программисту достаточно написать просто
BigStruct foo() {
W>    BigStruct r;
W>    ...
W>    return r;
W>}

W>И компилятор сам сделает замену: зарезервирует память в вызывающей функции и возвратит из функции указатель на r.
W>И это требование! То есть так поступать компилятор обязан даже при полностью выключенной оптимизации. И, конечное же, все компиляторы так и поступают: Пруф.
W>Поэтому такой трюк с дефолтным параметром сугубо вредный: он явно выражает то, что и так записано в ABI как необходимое действие.


вот тут я перестал понимать, ведь это самое r и будет в стеке функции, который помрёт, т.е. от возврата указателя толку мало, или там будет какая-то неявная обёртка в memcpy?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.