2011-02-10 4 views
1

Пример Функция 1возвращение оптимизации функции стоимости

int func1 (int arg) 
{ 
    return arg + 10; 
} 

Образец Функция 2

int func1 (int arg) 
{ 
    int retval = arg + 10; 
    return retval; 

} 

func_xyz (int x); 

int main() 
{ 
int a = 10; 
int p = func1 (a); 

func_xyz(p); 
} 

Есть ли разница между поведением во время выполнения этих функций (пример 1 и образец 2)?

У меня есть определение функции в моем коде, в котором используется определение функции стиля образца 1. Когда я вызываю эту функцию, миллион раз (не воспроизводятся для меньших итераций) и пытаюсь передать это значение func_xyz, я получаю segfault. Однако, когда я использую определение стиля образца 2, segfault уходит. Но я не могу понять причину такого поведения.

+3

И ваш вопрос ...? –

+3

Где вопрос? –

+0

что, если он пытается спросить, что более эффективно или лучше? – ayush

ответ

2

in ТЕОРИЯ в функции2 будет инициирована локальная переменная (которая займет немного больше места), тогда вычисление будет рассчитано и значение будет скопировано в местоположение переменной.
После этого копия будет скопирована на возвращаемое значение. Так что это дополнительная операция копирования.

in REALITY компиляторы делают эту оптимизацию во время компиляции и удаляют ненужные переменные, если их значение фактически не используется. (рефакторинг)

+0

Не может 'return arg + 10;' также неявно использовать локальную переменную для хранения результата 'arg + 10' перед возвратом?Я не имею в виду ничего подобного, просто, что сборка для обоих может выглядеть так: add r1, 10; // r1 + 10 не возвращается напрямую! '' ret r1; ' – Gravity

1

Вот некоторые сведения о return value optimization in compilers.

Попробуйте использовать класс, который имеет нетривиальный конструктор копирования, чтобы увидеть, что на самом деле происходит.

0

Нет абсолютно никакой разницы. Любой компилятор может видеть, что код просто

int main() { {}

Что делает вызываемая функция?