Список инициализатора конструктора и инициализация в заголовочном файле - PullRequest
0 голосов
/ 30 августа 2018

В кодовой базе, с которой я работаю, есть десятки переменных, инициализированных заголовком:

bool toBeTrue = true;
int var = 1;

И если они не инициализированы в заголовочном файле, они инициализируются в теле конструктора:

MyClass::MyClass()
{
 variable1 = 10;
 boolean2 = false;
};

Имеет ли смысл инициализация переменных в заголовочном файле (возможно, с указателями, инициализированными в nullptr, booleans и простыми ints в заголовочном файле?), Что замедляет время компиляции? И может ли перемещение всей инициализации переменной, перемещенной в список инициализации конструктора, сократить время компиляции?

1 Ответ

0 голосов
/ 30 августа 2018

Это:

MyClass::MyClass()
{
 variable1 = 10;
 boolean2 = false;
};

не инициализация! Члены будут инициализированы до запуска тела конструктора, а затем вы назначаете значения. Что вы имеете в виду, вероятно, разница между

Список инициализаторов

MyClass::MyClass() : variable1(10), boolean2(false) {}

и в инициализации класса (доступно начиная с C ++ 11, я считаю) в заголовке:

struct MyClass {
     int variable1 = 10;
     boolean2 = false;
};

В обоих последних случаях значения используются для инициализации элементов, поэтому разницы в скорости нет. Однако в первом случае вы делаете больше, чем на самом деле хотите (инициализация + назначение), и вам следует избегать этого, если это возможно.

Тонкая разница между инициализацией в классе и списком инициализаторов (см., Например, здесь ) заключается в том, что

variable1 = 10; 

может включать в себя копию. Это можно обойти с помощью прямой инициализации списка:

 struct MyClass {
     int variable1{10};
     bool boolean2{false};
};

Однако для int и bool это не имеет никакого значения.

...