0

Я осторожны с использованием = для инициализации новой переменной:Использование = для построения новой переменной

MyClass my_var = MyClass(some_data); 
  1. Потому что я считаю, что это требует my_var сначала быть построены по умолчанию, а затем назначен.
  2. Когда my_var является общей памятью, это может привести к условиям гонки.

Может кто-то подтвердить или опровергнуть мои страхи? Обрабатываются ли примитивные типы по-разному?

+2

http://stackoverflow.com/questions/1051379/is-there-a-difference-in-c-between-copy-initialization-and-direct-initializati – NPE

ответ

2

Поскольку я считаю, что для этого требуется, чтобы my_var был сначала сконфигурирован по умолчанию, а затем назначен.

No. Использование оператора = в объявлении переменной типа класса имеет специальную обработку. Компилятор никогда не будет строить по умолчанию, а затем скопировать объект переменной, как вы думаете. Что на самом деле произошел, а не является:

  1. ТЕмп MyClass объекта будет скопировать построенный из some_data, то my_var будет копировать возведенный из температуры, то температура будет освобождена. Как если бы вы написали это:

    MyClass my_var(MyClass(some_data)); 
    
  2. компилятор оптимизировать на темп полностью и просто скопировать построить my_var из some_data непосредственно.Как если бы вы написали это:

    MyClass my_var(some_data); 
    

    Это обычное дело, особенно если вы пишете это:

    MyClass my_var = some_data; 
    

    Вместо этого:

    MyClass my_var = MyClass(some_data); 
    

Когда my_var - общая память, это может привести к условиям гонки.

Способ, которым вы его написали, нет. my_var - либо локальная переменная функции/method, либо глобальная переменная. В любом случае, объявление и назначение переменной в том же самом заявлении не является условием гонки, так как переменная не может использоваться до тех пор, пока она не будет построена. Если вы сначала объявите переменную и назначьте ее в отдельном заявлении, тогда будет условие гонки.

+0

Что делать, если 'my_var' является функцией-локальным статическим ? –

+0

Функция-local static инициализируется только один раз, когда функция вызывается в первый раз. Было бы условие гонки, только если несколько потоков вызовут эту функцию одновременно. Но как только он был построен, больше нет условий гонки на строительство, просто на доступ (если логика внутри объекта не является потокобезопасной). –

+0

Таким образом, * * есть условие гонки, если функция называется «впервые» двумя разными потоками одновременно. –

1

Поскольку я считаю, что для этого требуется, чтобы my_var был сначала сконфигурирован по умолчанию, а затем назначен.

Номер my_var не был создан по умолчанию и не является временным. Сначала построено значение типа MyClass, используя some_data, а затем конструктор копирования (или переместите конструктор, если вы на C++ 11) вызывается для построения my_var.

Когда my_var является общей памятью, это может привести к условиям гонки.

Ну, да. Теоретически это может привести к условиям гонки.

0

В вашей кодовой строке вызывается только экземпляр-копия MyClass.

Если вы написали MyClass my_var и позже в коде my_var = some_data, тогда будет называться MyClass::operator=(...).

Чтобы завершить этот ответ, я не вижу, как общая переменная может быть «подвержена риску гоночного состояния» во время строительства (потому что она не может использоваться до тех пор, пока она не будет построена).

Смежные вопросы