当返回一个变量时,一步一步会发生什么。我知道如果它是内置的并且适合,它会被扔进 rax/eax/ax。当它不适合和/或不是内置的时会发生什么?更重要的是,是否有保证的复制构造函数调用?
编辑:析构函数呢?这叫“有时”、“总是”还是“从不”?
当返回一个变量时,一步一步会发生什么。我知道如果它是内置的并且适合,它会被扔进 rax/eax/ax。当它不适合和/或不是内置的时会发生什么?更重要的是,是否有保证的复制构造函数调用?
编辑:析构函数呢?这叫“有时”、“总是”还是“从不”?
返回值的存储位置完全取决于调用约定,并且非常特定于体系结构和系统。
允许编译器省略对复制构造函数的调用(即,它不必调用复制构造函数)。请注意,从函数返回值也可能会调用赋值运算符,具体取决于对函数的返回值执行的操作。
如果函数/方法返回类型是引用,则实际上不会发生复制。如果它是非引用返回类型,则可能会根据您平台的调用约定进行复制。
在寄存器丰富(通常是 RISC)架构中,可能会有大量的寄存器分配来保存适度大的返回结构。这是为了避免与缓存/注册事务相比昂贵的过多内存事务。
在您的问题通过您提到的寄存器暗示的 x86-descended intel 系列上,它比在 RISC 上更有可能调用复制构造函数。