使用=构造新变量

Using = for constructing new variable

本文关键字:变量 新变量 使用      更新时间:2023-10-16

我对使用=初始化新变量持谨慎态度:

MyClass my_var = MyClass(some_data);
  1. 因为我认为这需要首先默认构造my_var,然后进行赋值
  2. my_var是共享内存时,这可能会导致竞争条件

有人能证实或否认我的恐惧吗?原始类型有区别对待吗?

因为我认为这需要首先默认构造my_var,然后进行赋值。

否。对类类型的变量声明使用=运算符具有特殊处理。编译器永远不会像您想象的那样默认构造然后复制变量对象。实际会发生的是:

  1. 将从some_data复制构造临时MyClass对象,然后从临时复制构造my_var,然后释放临时。就像你写的那样:

    MyClass my_var(MyClass(some_data));
    
  2. 编译器将完全优化掉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=(...)

为了完成这个答案,我不明白共享变量在构建过程中如何"面临竞争条件的风险"(因为在构建之前无法共享)。