我对使用=
初始化新变量持谨慎态度:
MyClass my_var = MyClass(some_data);
my_var
首先默认构建,然后分配。my_var
是共享内存时,这可能会导致竞争条件。有人可以证实或否认我的恐惧吗?原始类型的处理方式不同吗?
答案 0 :(得分:2)
因为我认为这需要首先默认构造my_var,然后分配。
没有。在类类型的变量声明上使用=
运算符具有特殊处理。编译器永远不会像你想象的那样默认构造然后复制变量对象。实际发生的事情是:
临时MyClass
对象将从some_data
复制构造,然后my_var
将从temp复制构造,然后临时将被释放。好像你写了这个:
MyClass my_var(MyClass(some_data));
编译器将完全优化掉temp,并直接从my_var
复制构造some_data
。好像你写了这个:
MyClass my_var(some_data);
这是通常的情况,特别是如果你写这个:
MyClass my_var = some_data;
而不是:
MyClass my_var = MyClass(some_data);
当my_var是共享内存时,这可能会导致竞争条件。
你写的方式,没有。 my_var
是函数/方法的局部变量,或者是全局变量。无论哪种方式,在同一语句中声明和赋值变量都不是竞争条件,因为变量在构造之后才能共享。如果先声明变量并在单独的语句中指定它,那么就会出现竞争条件。
答案 1 :(得分:1)
因为我认为这需要首先默认构造my_var,然后分配。
没有。 my_var
永远不会默认构建,也不是临时构造。首先使用MyClass
构造类型some_data
的右值,然后调用复制构造函数(如果您在C ++ 11中,则移动构造函数)来构造my_var
。
当my_var是共享内存时,这可能会导致竞争条件。
嗯,是的。从理论上讲,它可能导致竞争条件。
答案 2 :(得分:0)
在您的代码行中,只调用MyClass
的复制构造函数。
如果您在代码MyClass my_var
中撰写my_var = some_data
及更高版本,则会调用MyClass::operator=(...)
。
为了完成这个答案,我没有看到共享变量在构造过程中如何“处于竞争状态的风险中”(因为它在构建之前无法共享)。