Преимущество использования агрегированного списка инициализации перед конструктором?

StackOverflow https://stackoverflow.com/questions/902077

  •  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 будет существовать, чтобы разрешить этот синтаксис для любого класса.

Ниже приведены сценарии, в которых используется список инициализаторов:

  1. Для инициализации нестатических постоянных элементов данных.
  2. Для инициализации ссылочных элементов.
  3. Для инициализации объектов-членов, у которых нет конструктора по умолчанию.
  4. Для инициализации членов базового класса.
  5. Когда имя параметра конструктора совпадает с именем элемента данных.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top