Подтвердить что ты не робот

Разница между A * pA = новая A; и A * pA = новый A();

в С++, какова точная разница между обоими динамическими созданиями объектов:

A* pA = new A;

A* pA = new A(); 

Я сделал несколько тестов, но, похоже, в обоих случаях вызывается конструктор по умолчанию и только он. Я ищу любую разницу в производительности...

Спасибо

4b9b3361

Ответ 1

Если A является POD-типом, тогда new A будет выделять новый объект A, но оставьте его с неопределенным значением, иначе new A по умолчанию будет инициализировать новый объект.

Во всех случаях new A() будет стоить инициализировать новый объект A.

Это, очевидно, другое поведение для типов POD, но также влияет на не-POD, типы неединичных классов без конструктора с объявленным объявлением.

например.

struct A
{
    int a;
    std::string s;
};

A - тип класса не-POD без конструктора, объявленного пользователем. Когда инициализируется инициализация A, вызывается неявно определенный конструктор, который вызывает конструктор по умолчанию для s (не-POD-тип), но A не инициализируется.

Когда значение A инициализируется значением, так как оно не имеет конструктора с объявленным объявлением, все его члены инициализируются значением, что означает, что вызывается конструктор по умолчанию для s и A инициализируется нулем.

ИСО 14882: 2003 ссылки:

  • 5.3.4 [expr.new]/15: Как объекты, выделенные выражением new, инициализируются в зависимости от того, опущен ли инициализатор, пара круглых скобок или иначе.

  • 8.5 [dcl.init]/5: Значение инициализации нуля, инициализация по умолчанию и инициализация значения.

  • 12.1 [class.ctor]/7,8: Форма написанного пользователем конструктора, который соответствует поведению неявно определенного конструктора по умолчанию.

  • 12.6.2 [class.base.init]/4: Как инициализируются базы и элементы, которые не указаны в списке инициализатора элемента конструктора.

Ответ 2

Это точно то же самое, и производительность мудрая:)

Ответ 3

Лексер должен будет сканировать на два символа меньше в первой версии, поэтому процесс компиляции немного быстрее;)

Ответ 4

см. код реализации STL (например, распределитель), тогда вы поймете.