что происходит с возвращаемой функции в void функции
у меня только один вопрос : что происходит с возвращаемым методом в методе который не может ничего возвращать .
Что конкретно происходит в методе handlesum , куда возвращается значения метода sum
#include<iostream>
using namespace std;
int sum(int a,int b){
return a+b;
}
void handlesum(int a,int b){
sum(a,b); // ЧТО КОНКРЕТНО ЗДЕСЬ ПРОИСХОДИТ
}
int main(int argc, char const *argv[])
{
handlesum(1,2);
return 0;
}
Ответы (3 шт):
Ничего. Если компилятор без оптимизатора - ну, какой-то код суммирования создаст, результат - в помойку, ну, а если компилятор поумнее - то и этого не будет.
Вот, убедитесь:
sum(int, int):
lea eax, [rdi+rsi]
ret
handlesum(int, int):
ret
main:
xor eax, eax
ret
_GLOBAL__sub_I_sum(int, int):
sub rsp, 8
mov edi, OFFSET FLAT:_ZStL8__ioinit
call std::ios_base::Init::Init() [complete object constructor]
mov edx, OFFSET FLAT:__dso_handle
mov esi, OFFSET FLAT:_ZStL8__ioinit
mov edi, OFFSET FLAT:_ZNSt8ios_base4InitD1Ev
add rsp, 8
jmp __cxa_atexit
В общем случае: возвращаемое значение просто не используется, вот и все.
Там ничего не происходит. И ничего это не даст. Функции, которые возвращают void, то есть не возвращают просто выполняют свой функционал, описанный в виде операторов: присваивают значения переменным, выводят текст, считывают ввод и т.д.
Во-вторых, если вы просто так вызовите функцию, которая что-то возвращает, то она выполнится, даже куда-нибудь что-нибудь выведет, если в ней есть фукнция cout, НО свое значение, которая она вернула никуда она не запишет. Поэтмому функции, которые возвращают значение обычно пишут так:
int a = sum(x, y);
ИЛи другой тип данных.
При вызове фукнции, которая возвращает значение, значение, которое она возращает ПОДСТАВЛЯЕТСЯ ВМЕСТО ВЫЗОВА ФУНКЦИИ. Например:
if (isMoreThatZero(3) == true)) cout << "HELLO";
Выведет HELLO, так как 3 больше, чем 0 (эта фукнция проверяет, больше ли число, чем 0), значит значение true подставится вместо вызова функции и мы получим это:
if (true == true)
В вашем случае это значение, которое подставится вместо sum(a, b) ничего не будет значить, так как с ним вы ничего не делаете: не используете в цикле, не проверяете в условии, не присваиваете в переменную и т.д.
А вот методы void для того и нужны, чтобы вызывать их просто так: они выполнят ссвой функционал и движение по коду продолжится дальше.
Без никаких оптимизаций при возвращении из функции sum вызывается деструктор временного возвращаемого объекта. Так как деструктор в простом типе int - элементарный (его просто нет), то вызываться деструктор не будет. А само возвращаемое значение останется лежать мусором в памяти стека.
С оптимизацией возвращаемое значение может остаться только в регистрах процессора. Память в стеке выделяться не будет.
При возвращении сложных типов (классов) будет всегда создаваться временный объект и после завершении строчки кода этот временный объект будет ликвидирован.
Пример :
class Hard{
...};
Hard func(void){
...
return {..}}
void meth ( Hard h ) {
...}
int main(){
meth ( func ( ) ) ;
}
Сначала вызывается метод func, при возврате значения он создаёт временный объект Hard, расположенный в стеке. Этот временный объект будет в рабочем состоянии до тех пор пока другая функция meth не закончит с ней работу. Затем будет вызван его деструктор.
вызывается func
..
при возврате создаётся Hard
отдаётся функции meth
..
meth завершился
все временные объекты ликвидируются
и вызывается деструктор ~Hard();