Est-ce que les compilateurs C de manière générale « optimiser » malloc et libre de nouveau et supprimer?

voix
0

Si je vous écris 100% ANSI C, mais la compilation dans les fichiers .cpp sera le compilateur « optimiser » automatiquement les appels malloc gratuits et de nouvelles et supprimer? Est-ce que même pas de sens compte tenu de leurs différences? Je ne pensais pas que ce soit la façon dont cela a fonctionné, mais un de mes amis a dit que ce qui se passe.

Créé 27/11/2018 à 15:15
source utilisateur
Dans d'autres langues...                            


3 réponses

voix
5

C ++ est très spécifique c.malloc:

Les fonctions calloc(), malloc()et realloc()ne tentent pas d'allouer de la mémoire en appelant ::operator new().

La fonction free()ne tente pas de désaffecter le stockage en appelant ::operator delete().

Créé 27/11/2018 à 15:18
source utilisateur

voix
3

Il y a un peu d'une ambiguïté dans la question.

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

Ces deux, en fait, font la même chose: créer une valeur non initialisée sur le tas et assignez son adresse au pointeur sur le côté gauche.

Mais:

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

Les deux ne font pas nécessairement la même chose. Si Sa un constructeur, new Sva allouer de la mémoire et appeler le constructeur ; malloc(sizeof S)ne sera allouer de la mémoire.

Je l' ai mentionné une ambiguïté. Il y a un autre sens possible pour « remplacer new, et qui utilise des appels à operator new:

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

Sur la surface, par défaut ces deux font la même chose: ils allouer de la mémoire sur le tas pour un objet de type Set renvoient un pointeur vers cette mémoire; ni l' un initialise l'objet. Mais il y a une différence importante. Si mallocne peut pas allouer de la mémoire , il renvoie un pointeur NULL. Si operator newne peut pas allouer de la mémoire , il lance une exception de type std::bad_alloc(il y a plus que ça, mais c'est assez de différence pour l' instant).

C'est aussi vrai pour new S: il jette une exception si elle ne peut pas allouer de la mémoire, alors que mallocrenvoie un pointeur NULL.

Créé 27/11/2018 à 15:30
source utilisateur

voix
1

Est-ce que les compilateurs C de manière générale « optimiser » malloc et libre de nouveau et supprimer?

Non .

L'optimisation est un acte qui réduit la charge de travail de votre programme.

Depuis newet deleteappeler les constructeurs et destructeurs respectivement, tandis que malloc()et free()ne pas , cela n'a aucun sens de les optimiser.

En général newappellera malloc(), qui ajoute également à mon point ci - dessus, comme mentionné dans Does :: opérateur new (size_t) utiliser malloc ()?

PS: « Je vous écris 100% ANSI C » ne va pas faire un compilateur C ++ heureux de quelque façon que ...

Créé 27/11/2018 à 15:18
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more