GCC 会内联一条语句——无论我多么努力地阻止它。我试过了
-fno-inline
-O0
__attribute__ ((noinline))
虚拟汇编("")
没有成功! 这里的代码:
#include<iostream>
using namespace std;
struct A {
A() {cout << "A::A()" <<endl; }
A(const A& a) {cout << "A::A(copy)" <<endl; }
A& operator=(const A& a) {cout << "A::=()" <<endl; return *this;}
};
A __attribute__ ((noinline)) func()
{
cout << "func()" << endl;
A loc;
asm("");
return loc;
}
int main() {
A a = func();
}
这个 (g++ (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2) 的不幸输出是
func()
A::A()
语句 A a = func(); 发生了什么? ??
做这个实验的原因是我想知道当执行到这条语句时会发生什么(因为我需要控制这是如何完成的):
A a = func();
我读到复制构造函数在执行时被调用
A a = b;
(在这种情况下会调用复制构造函数。但在 A a = func(); 的情况下不会) 该函数是内联的。自从我的“struct A”以来,我需要控制这个声明 在现实生活中包含需要处理的动态分配数据。
我是否遗漏了一些明显的东西?!
最佳答案
不,这与被内联的函数无关。内联函数不会改变可观察到的行为。
这是一种称为复制省略的优化,它允许编译器通过直接在目标位置构造返回值来避免复制。您可以使用 g++ 标志 -fno-elide-constructors
禁用它。
无论如何,动态分配的数据应该不是问题。假设一个健全的复制构造函数,您将看到的唯一区别可能是更好的性能。
关于c++ - 未在函数结果上调用复制构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7244363/