OVH Cloud OVH Cloud

[MALLOC] & Composition de fonctions

3 réponses
Avatar
jeanpierre537
Il y a queque chose que je n'ai jamais compris lorsque l'on compose
deux fonctions f1 et f2 du genre

b =3D f2 ( f1 (a) );

on voit que f1 return un r=E9sultat qui devient l'argument de f2.
Or le r=E9sultat retourn=E9 par f1 occupe de la m=E9moire.
Que devient cette m=E9moire une fois l'appel de f2 termin=E9 ?

exemple :
double f1 (int a)
{
return 2.0 * a;
}

il y a bien quelquepart de la m=E9moire pour un "double" qui est
r=E9serv=E9e ?
Quand est elle lib=E9r=E9e ?

3 réponses

Avatar
Marc Boyer
a écrit :
Il y a queque chose que je n'ai jamais compris lorsque l'on compose
deux fonctions f1 et f2 du genre

b = f2 ( f1 (a) );

on voit que f1 return un résultat qui devient l'argument de f2.
Or le résultat retourné par f1 occupe de la mémoire.


Et quand on écrit tout simplement:
b= f2( a*2+1 );
ou même
b= a*2+1;
t'es-tu jamais demandé où était placé 'a*2+1' ?

Que devient cette mémoire une fois l'appel de f2 terminé ?


Libéré.

exemple :
double f1 (int a)
{
return 2.0 * a;
}

il y a bien quelquepart de la mémoire pour un "double" qui est
réservée ?


Pas forcément. Le compilo peut décider tout seul d'affecter
directement le résultat à la variable qui stocke la valeur de retour.

Sinon, une implémentation 'courrante' consiste à empiler les
paramètre sur une pile, et le résultat aussi. Ca doit admettre
de multiples variations.

Marc Boyer
--
À vélo, prendre une rue à contre-sens est moins dangeureux
que prendre un boulevard dans le sens légal. À qui la faute ?

Avatar
Stan
"Marc Boyer" a écrit dans le message
de news:
Pas forcément. Le compilo peut décider tout seul d'affecter
directement le résultat à la variable qui stocke la valeur de retour.

Sinon, une implémentation 'courrante' consiste à empiler les
paramètre sur une pile, et le résultat aussi. Ca doit admettre
de multiples variations.

Marc Boyer
--


J'ajouterai que le titre du post est donc erroné, le malloc n'intervient
nullement dans ce contexte.

--
-Stan

Avatar
kanze
wrote:
Il y a queque chose que je n'ai jamais compris lorsque l'on
compose deux fonctions f1 et f2 du genre

b = f2 ( f1 (a) );

on voit que f1 return un résultat qui devient l'argument de
f2. Or le résultat retourné par f1 occupe de la mémoire. Que
devient cette mémoire une fois l'appel de f2 terminé ?


Comme a dit Marc, le problème n'est pas différent que pour le
résultat de n'importe quelle expression. Et la réponse dépend
des convetions de l'API -- chez moi, et les paramètres et les
valeurs de retour sont dans des régistres. Sur d'autres
processeurs, les paramètres se trouvent sur la pile.

exemple :
double f1 (int a)
{
return 2.0 * a;
}

il y a bien quelquepart de la mémoire pour un "double" qui est
réservée ?


Il doit bien y avoir une place pour le mettre, oui. Pas
forcement dans ce qu'on appelle la mémoire.

Quand est elle libérée ?


Après qu'on s'en est servi. C'est le problème du compilateur (si
la valeur est en mémoire).

Le problème est un peu plus compliqué dans le cas des types de
classe. Dans ce cas-là, il faut bien les mettre en mémoire (pour
avoir une adresse de this), et la norme spécifie que leur
destructeur sera appelé à la fin de l'expression complète. Le
compilateur les met donc toujours sur la pile. (En fait,
certains compilateurs sont assez intelligent pour reconnaître
quand le this n'est pas réelement nécessaire, et pour mettre des
petites struct dans des régistres.)

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34