在C++中,当返回变量时会发生什么?

在C++中,当返回变量时会发生什么?,c++,return-value,copy-constructor,C++,Return Value,Copy Constructor,当返回一个变量时,一步一步地发生了什么。我知道,如果它是一个内置的和合适的,它会被扔进rax/eax/ax。当它不合适和/或不是内置的时会发生什么?更重要的是,是否有保证的复制构造函数调用 编辑:析构函数呢?这是有时调用、始终调用还是从不调用?其中存储的返回值完全取决于,并且非常特定于体系结构和系统 允许编译器省略对复制构造函数的调用,即不必调用复制构造函数。请注意,从函数返回值也可能调用赋值运算符,具体取决于对函数返回值所做的操作。如果函数/方法返回类型是引用,则实际上不会进行复制。如果是非引

当返回一个变量时,一步一步地发生了什么。我知道,如果它是一个内置的和合适的,它会被扔进rax/eax/ax。当它不合适和/或不是内置的时会发生什么?更重要的是,是否有保证的复制构造函数调用


编辑:析构函数呢?这是有时调用、始终调用还是从不调用?

其中存储的返回值完全取决于,并且非常特定于体系结构和系统


允许编译器省略对复制构造函数的调用,即不必调用复制构造函数。请注意,从函数返回值也可能调用赋值运算符,具体取决于对函数返回值所做的操作。

如果函数/方法返回类型是引用,则实际上不会进行复制。如果是非引用返回类型,则可能会根据平台的调用约定进行复制

在寄存器丰富的典型RISC体系结构中,可能存在大量寄存器分配,以容纳适度大的返回结构。这是为了避免过多的内存事务,与缓存/寄存器事务相比,内存事务的开销更大


您提到的寄存器表明,在x86派生的intel系列上,调用复制构造函数的可能性比在RISC上更大。

取决于操作系统的约定。是否为本地版本调用过析构函数?@wowus:没有,因为实际上没有本地版本。如果省略了对复制构造函数的调用,则返回的对象将在返回值中就地构造。@wowus:如果没有副本,调用析构函数将使该实例无效。那么像。。。tf{ta;returna;}@wowus:可能调用也可能不调用复制构造函数。我希望未优化的构建(例如用于调试的构建)会调用复制构造函数,但优化的构建不会。这完全取决于编译器,它决定做什么才是最合理的。根据@KennyTM和我所说的,如果不调用复制构造函数,那么显然不能调用析构函数。