2016-07-18 2 views
8

Агрегатная инициализация инициализирует элементы данных объекта класса aggrete, тогда как инициализация значения агрегата будет сначала нулевой инициализировать, а также обнуляет байты заполнения, как показано в следующем спецификация цитатаАгрегация по отношению к значению, инициализирующему объект совокупного класса с заполнением

если Т (возможно, резюме квалифицированного) несрастание типа класса, каждый не-статический член данных и каждый базовый класс подобъект равен нуль инициализирован и заполнение инициализируются нулевых биты;

Означает ли это, что, как правило, следует избегать инициализации агрегированные с использованием () Структуры и предпочитают {} вместо потому что последний не должен гарантировать, что обивка биты равны нулю?

Если ответ на вышеизложенное «нет», существуют случаи, когда реализации не заполняют заполнение {}, а делают с ()? И среди этих случаев лучший выбор для программиста?

+0

[Clang] (http://coliru.stacked-crooked.com/a/e30e266d90c16662) соблюдает правило, а [gcc] (http://coliru.stacked-crooked.com/a/eff8609fc153d914) и MSVC все еще обнуляет байты заполнения в моем тесте. – Jamboree

ответ

1

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

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

+0

Спасибо. Мой вопрос обновляется соответствующим образом. Почему вы ограничили свое участие в одночастных агрегатах? Реализуются ли реализации по-разному, если структуры содержат multiple.members с возможным множеством межпользовательских дополнений? –

+0

Я не имел в виду только одночастные агрегаты. Я бы ожидал 'struct A {char c; short s; long long ll}; 'для инициализации одним 128 или 256-битным значением (с учетом постоянных аргументов), а не тремя отдельными значениями. –