在linux下,編譯器有時會對複製構造函數的調用做優化,避免不必要的複製構造函數調用。可以使用命令g++ xxx.cpp -fno-elide-constructors
命令關閉編譯器優化。
例如下面代碼的執行結果:
#include <iostream>
using namespace std;
class Point
{
public:
Point(int xx = 0, int yy = 0)
{
x = xx;
y = yy;
}
Point(Point &p);
int getX() { return x; }
int getY() { return y; }
~Point() {}
private:
int x, y;
};
Point::Point(Point &p)
{
x = p.x;
y = p.y;
cout << "Calling the copy constructor" << endl;
}
void fun1(Point p)
{
cout << p.getX() << endl;
}
Point fun2()
{
Point a(1, 2);
return a;
}
int main()
{
Point a(4, 5);
Point b = a;
cout << b.getX() << endl;
fun1(b);
b = fun2();
cout << b.getX() << endl;
return 0;
}
使用g++ xxx.cpp && ./a.out
命令輸出結果爲:
Calling the copy constructor
4
Calling the copy constructor
4
1
而使用g++ xxx.cpp && ./a.out
命令關閉編譯器優化後,輸出結果爲:
Calling the copy constructor
4
Calling the copy constructor
4
Calling the copy constructor
1