使用=构造新变量
Using = for constructing new variable
我对使用=
初始化新变量持谨慎态度:
MyClass my_var = MyClass(some_data);
- 因为我认为这需要首先默认构造
my_var
,然后进行赋值 - 当
my_var
是共享内存时,这可能会导致竞争条件
有人能证实或否认我的恐惧吗?原始类型有区别对待吗?
因为我认为这需要首先默认构造my_var,然后进行赋值。
否。对类类型的变量声明使用=
运算符具有特殊处理。编译器永远不会像您想象的那样默认构造然后复制变量对象。实际会发生的是:
-
将从
some_data
复制构造临时MyClass
对象,然后从临时复制构造my_var
,然后释放临时。就像你写的那样:MyClass my_var(MyClass(some_data));
-
编译器将完全优化掉temp并且简单地直接从CCD_ 9复制构造CCD_。就像你写的那样:
MyClass my_var(some_data);
这是通常的情况,尤其是如果你写这样的话:
MyClass my_var = some_data;
取而代之的是:
MyClass my_var = MyClass(some_data);
当my_var是共享内存时,这可能会导致竞争条件。
您编写它的方式,没有。my_var
要么是函数/方法的局部变量,要么是全局变量。无论哪种方式,在同一语句中声明和分配变量都不是竞争条件,因为在构造变量之前不能共享该变量。如果您首先声明变量并在单独的语句中分配它,那么就会出现竞争条件。
因为我认为这需要首先默认构造my_var,然后进行赋值。
否。my_var
从来不是默认构造的,也不是临时的。首先使用some_data
构造类型为MyClass
的右值,然后调用复制构造函数(如果您在C++11中,则调用移动构造函数)来构造my_var
。
当my_var是共享内存时,这可能会导致竞争条件。
嗯,是的。从理论上讲,这可能会造成种族状况。
在代码行中,只调用MyClass
的复制构造函数。
如果您在代码my_var = some_data
中编写MyClass my_var
和更高版本,则会调用MyClass::operator=(...)
。
为了完成这个答案,我不明白共享变量在构建过程中如何"面临竞争条件的风险"(因为在构建之前无法共享)。
- 堆栈粉碎 在我在代码中添加新变量以及一些操作后C++检测到
- 从 for 循环的每次迭代创建一个新变量
- 被允许在构造函数中创建新变量
- 获取“将返回值分配给新变量”的警告和输出是内存地址
- 使用函数创建一个新变量
- C++对现有变量或新变量的条件引用
- 程序在尝试将 file.read() 文件() 到新变量时停止工作
- OpenCV C++:声明一个新变量会导致堆栈损坏
- 在c++中为类的定义添加新变量
- C 确实const_cast诱导新变量
- 使用=构造新变量
- 找到最小值,并将其按相同的顺序分配给新变量-C++
- 如何创建一个新变量并同时在std::tie中使用它
- C++:将指针设置为 nullptr 和将其初始化为新变量类型之间的区别
- C++For循环在输入新变量时被卡住
- 为什么新变量的初始化本身有效
- 具有 #define 的新变量
- 别名而不是糖语法的新变量
- C++ 奇怪的情况,例如将现有变量应用于新变量
- 我是给同一个变量赋值还是重新定义一个新变量