它可能会被优化,是的。但仍具有对过程中的一些控制,例如,假设代码:
int x = 1;
x = 1;
x = 1;
x = 1;
volatile int y = 1;
y = 1;
y = 1;
y = 1;
只要既不的x,或y被用于该片段的下方,VS 2010生成代码:
int x = 1;
x = 1;
x = 1;
x = 1;
volatile int y = 1;
010B1004 xor eax,eax
010B1006 inc eax
010B1007 mov dword ptr [y],eax
y = 1;
010B100A mov dword ptr [y],eax
y = 1;
010B100D mov dword ptr [y],eax
y = 1;
010B1010 mov dword ptr [y],eax
即,优化将所有行用“x”去掉,并将所有四行用“y”去掉。这就是易失性的工作原理,但重点是你仍然可以控制编译器为你做什么。
无论是类还是原始类型 - 都取决于编译器,它的优化上限有多复杂。
学习另一个代码段:
class A
{
private:
int c;
public:
A(int b)
{
*this = b;
}
A& operator = (int b)
{
c = b;
return *this;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
int b = 0;
A a = b;
a = b;
a = b;
return 0;
}
Visual Studio 2010的优化条所有代码什么都没有,在发布版本与“全面优化” _tmain不只是任何操作并立即返回零。
我不紧密票同意。这是一个真实的,可回答的问题。 –
当删除副本会导致代码中存在错误时,那么您在开始时就设计了错误的副本。你的代码不应该依赖于周围有多少物体,也不应该取决于事物被复制/分配的频率。 – PlasmaHH
复制ctor中的逻辑应该是用于复制对象的逻辑。如果它不被复制,那么为什么复制ctor逻辑需要运行? –