GCC会内联语句——不管我怎样试图阻止它。我尝试了:
-fno-inline
-O0
__attribute__ ((noinline))
dummy asm("")
但是都没有成功!以下是代码:
#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”在实际应用中包含需要处理的动态分配数据。
我是否漏掉了什么显而易见的东西?!
-fno-inline
影响的那样)。内联成员函数与ODR有关,而不是机器代码生成。 - R. Martinho Fernandes