C++中的变量访问内联函数

C++中的变量访问内联函数,c++,inline,C++,Inline,在内联函数中,建议编译器在编译时将一段代码复制到调用程序中 #include<iostream> inline void swap(int *a, int *b){ a=a^b; b=a^b; a=a^b; } int main(){ int a=2,b=3; swap(a,b); std::cout<<a<<b; return 0; } 这里,swap函数是按值调用的。 那么,假设上面的代码是

在内联函数中,建议编译器在编译时将一段代码复制到调用程序中

#include<iostream>
inline void swap(int *a, int *b){
    a=a^b;
    b=a^b;
    a=a^b;
}
int main(){
    int a=2,b=3;
        swap(a,b);
    std::cout<<a<<b;
    return 0;
}
这里,swap函数是按值调用的。 那么,假设上面的代码是由编译器内联的,那么实际的变量a和b将被传递,以便它能够完美地工作,还是具有内联函数的部分具有其他作用域

因为,如果它是内联的,那么代码将直接复制到这里的main中,并且由于不会发生参数传递,因此代码可以访问a和b

ps:这个问题被编辑了,因为我无法准确地用语言表达我的怀疑,所以它有可能被否决

为什么在使用指向a和b的指针之前,第一个代码无法工作

因为交换需要指针。没有指针就不能调用它,即使它是内联的。即使由于优化,语义发生了变化,程序仍然需要语法正确

还要注意,内联只是建议编译器内联函数。它的实际用途是,如果在多个翻译单元中定义函数,则可以防止出现多个定义错误。

在内联函数中,编译时的代码段会复制到调用程序中


这是完全错误的。使函数内联对程序的功能没有影响。如果函数在没有内联的情况下无法工作,那么当您将其内联时,它将无法开始工作,反之亦然

所以问题的前提是错误的。

您的内联函数和用法是错误的。您正在将变量传递给需要指针的函数

大体上,您的函数调用应该是: 互换a&b

如果您不想弄乱指针,我建议使用引用的版本:

swap的参数通过引用传递,这意味着函数将修改传递给swap的变量


取上面的主函数并打印出汇编语言。交换函数不应有分支或调用指令。根据需要增加优化级别某些编译器不会在最低优化级别内联代码,以使调试更容易。非常智能的编译器可能会用汇编语言指令替换整个函数进行交换。

请注意,内联关键字和内联是不相关的。您的交换在指针上执行xor。改为:内联void swapint*a,int*b{*a^*b;*b=*a^*b;*a=*a^*b;}作为swap&a和&b调用。虽然这不是一个很好的问题,但我不明白为什么会有这么多的反对票。这是一种误解,这是很自然的。这并不意味着你认为它是什么。它实际上与代码是否真正内联没有多大关系。相反,它与.inline void swapint*a,int*b{a=a^b;b=a^b;a=a^b;}相关-这是错误的,不是您想要的。您希望对指针指向的对象进行操作,而不是指针值本身。如果您的函数在没有内联的情况下无法工作,那么当您将其内联时,它将无法开始工作-如果它无法工作的原因是它在没有内联的情况下违反了ODR,那么它可能无法工作。假设优化最终将代码内联。那么它会工作吗?不会,因为优化不会改变正确代码的含义。@AdityaGaddhyan值得注意的是,即使函数使用指针编译,它也不会工作。它交换周围的指针,而不是指向的值。由于指针是按值传递的,因此没有明显的副作用,编译器可能会完全放弃该函数。很难击败执行时间,但不是你想要的。考虑空格SavaPint和A,INT&B作为替换。@ AdTyAGAdAdHAN代码必须首先是语法正确的。swapa,b;不正确,因为交换使用指针。如果您交换&a和&b;那么代码是正确的,编译器就可以选择内联代码,而不是调用函数和处理指针。@AdityaGaddhyan您的问题与内联无关。
#include <iostream>
using std::cout;

inline void my_swap(int& a, int& b)
{
  int temp = a;
  a = b;
  b = a;
}

int main()
{
  int p = 42, q = 1;
  cout << "p: " << p << ", q: " << q << "\n";
  swap(p, q);
  cout << "p: " << p << ", q: " << q << "\n";
  return 0;
}