Преимущество использования агрегированного списка инициализации перед конструктором?
-
05-09-2019 - |
Вопрос
Я новичок в C ++, и у меня есть вопрос...
Я попытался ответить на этот вопрос сам, создав тестовое приложение...в debug инициализация класса B генерирует меньше ассемблерного кода, но в режиме выпуска я не могу точно сказать...это полностью оптимизирует инициализацию:(
Допустим, у меня есть два класса:
class A
{
public:
int a, b, c, d;
A(int _a, int _b, int _c, int _d) : a(_a), b(_b), c(_c), d(_d)
{
}
};
class B
{
public:
int a, b, c, d;
};
Есть ли какое-либо преимущество в использовании
B b = {1, 2, 3, 4}
вместо того , чтобы
A a = A(1, 2, 3, 4);
?
Решение
Я не знаю о преимуществах производительности, но в целом предпочтительнее использовать конструктор.
Это связано с тем, что с помощью A члены a, b, c, d могут быть сделаны закрытыми.Таким образом, вы получаете инкапсуляцию с вашим подходом A, которого у вас нет в B.
Как разработчик классов, вы можете обеспечить строгое использование и присвоение переменных-членов с помощью конструктора.В вашем сценарии класса Б вы не можете.
Таким образом, хотя вы можете получить небольшое повышение производительности при использовании B, я бы поспорил, что оно будет незначительным и будет сведено на нет потенциальной головной болью из-за наличия незащищенных членов класса.
Другие советы
Для глобальных объектов и членов статического класса список инициализаторов не вызывает никакого кода во время выполнения.(Данные инициализации хранятся непосредственно в двоичном файле).
Если вы инициализируете много объектов или если код конструктора дорогой / большой, это может существенно повлиять на время загрузки.
Как уже было сказано, это верно только для простых старых данных, т. е.все, что может быть инициализировано с помощью списка инициализаторов в C ++ < 0x
Вам не нужно явно писать конструктор, и C-код, использующий этот тип инициализации, работает на C ++.
Если у вас сложные составные структуры простых файлов данных, инициализация переменных может быть проще с помощью списков инициализации, чем с помощью конструкторов:
B barr[5] = {
{1,2,3,4},
{5,6,7,8},
...
};
Недостаток в том, что это (в настоящее время) работает только для простых классов только с переменными-членами POD и что программисты могут быть не очень знакомы с синтаксисом.
Большинство классов не могут использовать списки инициализации (пока!), поэтому вам лучше использовать конструктор просто для обеспечения согласованности.В c ++ 0x std::initializer_list будет существовать, чтобы разрешить этот синтаксис для любого класса.
Ниже приведены сценарии, в которых используется список инициализаторов:
- Для инициализации нестатических постоянных элементов данных.
- Для инициализации ссылочных элементов.
- Для инициализации объектов-членов, у которых нет конструктора по умолчанию.
- Для инициализации членов базового класса.
- Когда имя параметра конструктора совпадает с именем элемента данных.