2016-02-16 2 views
3

В случае функции Inline компилятор копирует всю функцию из того места, где она была вызвана. Если я следую этой инструкции, o/p программы должен быть «2010», но он показывает o/p «2020». Почему это так? Не понял ли я определение функции Inline? Код опускается ниже:Inline Function in C++

#include<iostream> 
#include<cstdio> 
using namespace std; 

inline void f(int x) 
{ 
    printf("%d",x); 
    x=10; 
} 

int main() 
{ 
    int x=20; 
    f(x); 
    printf("%d\n",x); 
    return 0; 
} 
+0

_Did я понял определение функции Встраиваемый? _ Возможно. Вам нужно передать значение по ссылке. В настоящее время вы копируете значение при вызове 'f (int)' и изменяете копию. –

+0

Inlining не может изменить поведение хорошо сформированной программы. – juanchopanza

ответ

6

Тот факт, что функция встроена, не изменяет семантику функции.

Функция получает свой параметр по значению, поэтому единственное, что он изменяет, это его собственный параметр. Он не изменяет значение переменной «x» в main().

Имея эту функцию в строках, логическая семантика функции остается неизменной. Он по-прежнему изменяет только значение своего собственного параметра и не влияет на значение «x» в main(), и его встроенный статус не меняет этого.

3

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

2

Компилятор заменяет определение встроенных функций во время компиляции, а не ссылается на определение функции во время выполнения. Он не изменяет поведение функции или программы.

По-прежнему необходимо передать x по ссылке, а не по значению, чтобы изменить его.


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

2

Это не имеет никакого отношения к функции, объявленной встроенной.

Целое число передается по значению, то есть int x в функции является копией переданной функции. Затем копия изменяется до 10 и выходит из области действия, когда функция остается. Исходная переменная остается неизменной.

Если вы хотите изменить аргумент, передать по ссылке, то есть изменить функцию головы до inline void f(int &i)