Компиляторы C ++ обычно "оптимизируют" malloc и свободны для новых и удаления? - PullRequest
0 голосов
/ 27 ноября 2018

Если я пишу 100% ANSI C, но компилирую в .cpp файлы, компилятор автоматически «оптимизирует» malloc и бесплатные вызовы new и delete?Имеет ли это смысл, учитывая их различия?Я не думал, что это так, но мой друг сказал, что так и происходит.

Ответы [ 3 ]

0 голосов
/ 27 ноября 2018

Являются ли компиляторы C ++ в целом «оптимизирующими» malloc и свободными для новых и удаления?

Нет .

Оптимизация - это действие, которое уменьшаетрабочая нагрузка вашей программы.

Поскольку new и delete вызывают конструкторы и деструкторы соответственно, тогда как malloc() и free() делают не , нет смысла их оптимизировать.

Обычно new вызывает malloc(), что также добавляет к моему пункту выше, как упомянуто в Использует ли :: operator new (size_t) malloc ()?

PS: «Я пишу на 100% ANSI C» не собирается радовать компилятор C ++ каким-либо образом ...

0 голосов
/ 27 ноября 2018

В этом вопросе есть некоторая двусмысленность.

int *ip1 = malloc(sizeof int);
int *ip2 = new int;

Эти два фактически делают одно и то же: создают неинициализированное значение в куче и присваивают его адрес указателю слевасторона.

Но:

struct S { /* whatever */ };
S *sp1 = malloc(sizeof S);
S *sp2 = new S;

Эти двое не обязательно делают одно и то же.Если S имеет конструктор, new S выделит память и вызовет конструктор ;malloc(sizeof S) будет выделять только память.

Я упомянул неоднозначность.Есть и другое возможное значение для «замены new», при котором используются вызовы operator new:

struct S { /* whatever */ };
S *sp1 = malloc(sizeof S);
S *sp2 = ::operator new(sizeof S);

На первый взгляд, по умолчанию эти два делают одно и то же: они выделяют память в кучеобъект типа S и возвращает указатель на эту память; ни один не инициализирует объект. Но есть важное отличие. Если malloc не может выделить память, он возвращает нулевой указатель. Если operator new не может выделитьпамяти он выдает исключение типа std::bad_alloc (это еще не все, но на данный момент этого достаточно).

Это также верно для new S: он выдает исключение, если не может выделитьпамяти, в то время как malloc возвращает нулевой указатель.

0 голосов
/ 27 ноября 2018

C ++ очень специфичен для c.malloc:

Функции calloc(), malloc() и realloc() не пытаются распределить память путем вызова ::operator new().

Функция free() не пытается освободить память путем вызова ::operator delete().

...