On 24 mar, 02:32, Fabien LE LEZ wrote:On 23 Mar 2007 18:26:54 -0700, :J'ai besoin de savoir si une classe est cree sur la pile ou sur le
tas.
Juste par curiosité, pourquoi donc as-tu besoin de le savoir ?
En fait j'ai crée une classe qui manipule la classe CBase1 et
qui gère la libération de la mémoire. J'ai besoin de savoir
si je dois appeller delete si CBase1 est créée sur le tas.
On 24 mar, 02:32, Fabien LE LEZ <grams...@gramster.com> wrote:
On 23 Mar 2007 18:26:54 -0700, d...@hotmail.com:
J'ai besoin de savoir si une classe est cree sur la pile ou sur le
tas.
Juste par curiosité, pourquoi donc as-tu besoin de le savoir ?
En fait j'ai crée une classe qui manipule la classe CBase1 et
qui gère la libération de la mémoire. J'ai besoin de savoir
si je dois appeller delete si CBase1 est créée sur le tas.
On 24 mar, 02:32, Fabien LE LEZ wrote:On 23 Mar 2007 18:26:54 -0700, :J'ai besoin de savoir si une classe est cree sur la pile ou sur le
tas.
Juste par curiosité, pourquoi donc as-tu besoin de le savoir ?
En fait j'ai crée une classe qui manipule la classe CBase1 et
qui gère la libération de la mémoire. J'ai besoin de savoir
si je dois appeller delete si CBase1 est créée sur le tas.
On 24 mar, 09:35, "James Kanze" wrote:On Mar 24, 2:26 am, wrote:J'ai besoin de savoir si une classe est cree sur la pile ou
sur le tas.
C'est impossible de façon portable. Sur beaucoup de systèmes, en
revanche, la pile se trouve à des adresses connues, et la
comparaison d'adresse marche : une solution fréquente sur Sparc
ou sur PC, c'est de mettre la pile tout en haut de l'espace
adresse ; puisque la pile croît vers le bas sur ces deux
processeurs, si l'adresse est supérieur à l'adresse d'une
variable locale, elle est sur la pile.
Merci pour ces explications, mais comment fait-on pour mettre la pile
en haut de l'espace adresse ?
Je ne pensais pas qu'on pouvait le modifier
[...]Ca marche plutot bien en apparence, et je me sert de cette classe
comme base pour le polymorphisme.
C'est que tu n'en as pas essayé les cas que j'ai énumérés
ci-dessus.
Effectivement je n'ai pas essayé les creations avec new[] ,
ni en multi-thread Dans ces cas là, existe -il une solution ?
Par contre j'ai une interrogation, y a t il une autre facon de faire?
J'ai utilisé malloc et free, car la fonction globale new appelle une
2eme fois le constructeur ce qui est genant.
La fonction new n'appelle de constructeur. C'est une expression
new qui l'appelle. Donc :
p = new Toto ; // appel du constructeur...
p = operator new( sizeof Toto ) ;
// pas d'appel du constructeur...
La même dichotomie existe entre la fonction delete, et une
experssion delete.
Ok, je vois que j'utilisais mal la fonction new.
On 24 mar, 09:35, "James Kanze" <james.ka...@gmail.com> wrote:
On Mar 24, 2:26 am, d...@hotmail.com wrote:
J'ai besoin de savoir si une classe est cree sur la pile ou
sur le tas.
C'est impossible de façon portable. Sur beaucoup de systèmes, en
revanche, la pile se trouve à des adresses connues, et la
comparaison d'adresse marche : une solution fréquente sur Sparc
ou sur PC, c'est de mettre la pile tout en haut de l'espace
adresse ; puisque la pile croît vers le bas sur ces deux
processeurs, si l'adresse est supérieur à l'adresse d'une
variable locale, elle est sur la pile.
Merci pour ces explications, mais comment fait-on pour mettre la pile
en haut de l'espace adresse ?
Je ne pensais pas qu'on pouvait le modifier
[...]
Ca marche plutot bien en apparence, et je me sert de cette classe
comme base pour le polymorphisme.
C'est que tu n'en as pas essayé les cas que j'ai énumérés
ci-dessus.
Effectivement je n'ai pas essayé les creations avec new[] ,
ni en multi-thread Dans ces cas là, existe -il une solution ?
Par contre j'ai une interrogation, y a t il une autre facon de faire?
J'ai utilisé malloc et free, car la fonction globale new appelle une
2eme fois le constructeur ce qui est genant.
La fonction new n'appelle de constructeur. C'est une expression
new qui l'appelle. Donc :
p = new Toto ; // appel du constructeur...
p = operator new( sizeof Toto ) ;
// pas d'appel du constructeur...
La même dichotomie existe entre la fonction delete, et une
experssion delete.
Ok, je vois que j'utilisais mal la fonction new.
On 24 mar, 09:35, "James Kanze" wrote:On Mar 24, 2:26 am, wrote:J'ai besoin de savoir si une classe est cree sur la pile ou
sur le tas.
C'est impossible de façon portable. Sur beaucoup de systèmes, en
revanche, la pile se trouve à des adresses connues, et la
comparaison d'adresse marche : une solution fréquente sur Sparc
ou sur PC, c'est de mettre la pile tout en haut de l'espace
adresse ; puisque la pile croît vers le bas sur ces deux
processeurs, si l'adresse est supérieur à l'adresse d'une
variable locale, elle est sur la pile.
Merci pour ces explications, mais comment fait-on pour mettre la pile
en haut de l'espace adresse ?
Je ne pensais pas qu'on pouvait le modifier
[...]Ca marche plutot bien en apparence, et je me sert de cette classe
comme base pour le polymorphisme.
C'est que tu n'en as pas essayé les cas que j'ai énumérés
ci-dessus.
Effectivement je n'ai pas essayé les creations avec new[] ,
ni en multi-thread Dans ces cas là, existe -il une solution ?
Par contre j'ai une interrogation, y a t il une autre facon de faire?
J'ai utilisé malloc et free, car la fonction globale new appelle une
2eme fois le constructeur ce qui est genant.
La fonction new n'appelle de constructeur. C'est une expression
new qui l'appelle. Donc :
p = new Toto ; // appel du constructeur...
p = operator new( sizeof Toto ) ;
// pas d'appel du constructeur...
La même dichotomie existe entre la fonction delete, et une
experssion delete.
Ok, je vois que j'utilisais mal la fonction new.
On 24 Mar 2007 03:08:51 -0700, :Merci pour ces explications, mais comment fait-on pour mettre la pile
en haut de l'espace adresse ?
Comme l'a dit James, ça dépend de l'OS. Il faut donc t'intéresser à
l'API de ton OS.
Mais du coup, tu perds la portabilité.
On 24 Mar 2007 03:08:51 -0700, d...@hotmail.com:
Merci pour ces explications, mais comment fait-on pour mettre la pile
en haut de l'espace adresse ?
Comme l'a dit James, ça dépend de l'OS. Il faut donc t'intéresser à
l'API de ton OS.
Mais du coup, tu perds la portabilité.
On 24 Mar 2007 03:08:51 -0700, :Merci pour ces explications, mais comment fait-on pour mettre la pile
en haut de l'espace adresse ?
Comme l'a dit James, ça dépend de l'OS. Il faut donc t'intéresser à
l'API de ton OS.
Mais du coup, tu perds la portabilité.
Le hardware du PDP-11 mettait une forte penalité si char n'était pas
signé. Du coup, char est signé sous tous les Unix que je connais,
Le hardware du PDP-11 mettait une forte penalité si char n'était pas
signé. Du coup, char est signé sous tous les Unix que je connais,
Le hardware du PDP-11 mettait une forte penalité si char n'était pas
signé. Du coup, char est signé sous tous les Unix que je connais,
[...]Ca marche plutot bien en apparence, et je me sert de cette classe
comme base pour le polymorphisme.
C'est que tu n'en as pas essayé les cas que j'ai énumérés
ci-dessus.
Effectivement je n'ai pas essayé les creations avec new[] ,
ni en multi-thread Dans ces cas là, existe -il une solution ?
Oui, mais elle n'est pas tout légère. À chaque allocation, tu en
mets l'adresse renvoyée dans un std::set, à chaque libération,
tu l'enlève, et pour savoir, tu la cherches dans le std::set.
(Tu peux remplacer std::set par n'importe quelle collection,
évidemment. Mais de préférence une qui supporte directement
l'accès associatif.)
[...]
Ca marche plutot bien en apparence, et je me sert de cette classe
comme base pour le polymorphisme.
C'est que tu n'en as pas essayé les cas que j'ai énumérés
ci-dessus.
Effectivement je n'ai pas essayé les creations avec new[] ,
ni en multi-thread Dans ces cas là, existe -il une solution ?
Oui, mais elle n'est pas tout légère. À chaque allocation, tu en
mets l'adresse renvoyée dans un std::set, à chaque libération,
tu l'enlève, et pour savoir, tu la cherches dans le std::set.
(Tu peux remplacer std::set par n'importe quelle collection,
évidemment. Mais de préférence une qui supporte directement
l'accès associatif.)
[...]Ca marche plutot bien en apparence, et je me sert de cette classe
comme base pour le polymorphisme.
C'est que tu n'en as pas essayé les cas que j'ai énumérés
ci-dessus.
Effectivement je n'ai pas essayé les creations avec new[] ,
ni en multi-thread Dans ces cas là, existe -il une solution ?
Oui, mais elle n'est pas tout légère. À chaque allocation, tu en
mets l'adresse renvoyée dans un std::set, à chaque libération,
tu l'enlève, et pour savoir, tu la cherches dans le std::set.
(Tu peux remplacer std::set par n'importe quelle collection,
évidemment. Mais de préférence une qui supporte directement
l'accès associatif.)
. Et
aujourd'hui, quelle application n'est pas multi-thread (même
quand il n'y a aucune raison de l'être---on n'est vraiment pas
« in » si on n'est pas multi-thread).
. Et
aujourd'hui, quelle application n'est pas multi-thread (même
quand il n'y a aucune raison de l'être---on n'est vraiment pas
« in » si on n'est pas multi-thread).
. Et
aujourd'hui, quelle application n'est pas multi-thread (même
quand il n'y a aucune raison de l'être---on n'est vraiment pas
« in » si on n'est pas multi-thread).
On 24 Mar 2007 09:15:06 -0700, "James Kanze" :. Et
aujourd'hui, quelle application n'est pas multi-thread (même
quand il n'y a aucune raison de l'être---on n'est vraiment pas
« in » si on n'est pas multi-thread).
Une application n'a effectivement pas forcément besoin d'être
multithread mais...
- Le besoin peut s'en faire sentir plus tard (Ce fut mon cas
quand j'ai dû, au bout de 3 ans, rajouter du son dans une application
qui n'en avait pas du tout au départ.)
- Certaines API Win32 appellent des fonctions (callback) de
l'application dans un autre thread. Du coup, au moins sous Windows, on
a vite fait de faire du multithread sans forcément s'en apercevoir.
On 24 Mar 2007 09:15:06 -0700, "James Kanze" <james.ka...@gmail.com>:
. Et
aujourd'hui, quelle application n'est pas multi-thread (même
quand il n'y a aucune raison de l'être---on n'est vraiment pas
« in » si on n'est pas multi-thread).
Une application n'a effectivement pas forcément besoin d'être
multithread mais...
- Le besoin peut s'en faire sentir plus tard (Ce fut mon cas
quand j'ai dû, au bout de 3 ans, rajouter du son dans une application
qui n'en avait pas du tout au départ.)
- Certaines API Win32 appellent des fonctions (callback) de
l'application dans un autre thread. Du coup, au moins sous Windows, on
a vite fait de faire du multithread sans forcément s'en apercevoir.
On 24 Mar 2007 09:15:06 -0700, "James Kanze" :. Et
aujourd'hui, quelle application n'est pas multi-thread (même
quand il n'y a aucune raison de l'être---on n'est vraiment pas
« in » si on n'est pas multi-thread).
Une application n'a effectivement pas forcément besoin d'être
multithread mais...
- Le besoin peut s'en faire sentir plus tard (Ce fut mon cas
quand j'ai dû, au bout de 3 ans, rajouter du son dans une application
qui n'en avait pas du tout au départ.)
- Certaines API Win32 appellent des fonctions (callback) de
l'application dans un autre thread. Du coup, au moins sous Windows, on
a vite fait de faire du multithread sans forcément s'en apercevoir.
[...]Ca marche plutot bien en apparence, et je me sert de cette classe
comme base pour le polymorphisme.
C'est que tu n'en as pas essayé les cas que j'ai énumérés
ci-dessus.
Effectivement je n'ai pas essayé les creations avec new[] ,
ni en multi-thread Dans ces cas là, existe -il une solution ?
Oui, mais elle n'est pas tout légère. À chaque allocation, tu en
mets l'adresse renvoyée dans un std::set, à chaque libération,
tu l'enlève, et pour savoir, tu la cherches dans le std::set.
(Tu peux remplacer std::set par n'importe quelle collection,
évidemment. Mais de préférence une qui supporte directement
l'accès associatif.)
J'ai modifé mon code pour allouer des tableaux et garder
la trace de l'allocation sur la tas et je n'ai pas rencontré de pb.
dans ma classe j'ai ajouté 2 variables statiques, un qui indique un
utilisation de la fonction new[] et un qui compte le nombre
d'elements
alloués.
void* operator new[]( unsigned bytes )
{
nb_elem = bytes / sizeof(CBase1) ;
creation_dyn_tb = true;
void* result = ::operator new [] ( bytes );
return result;
}
void operator delete[]( void* p )
{
::operator delete[]( p);
}
ensuite dans le constructeur chaque élèment note s'il est créé
sur le tas ou pas:
CBase1::CBase1(const std::string& name)
: m_name(name)
{
if ( creation_dyn_tb == false )
{
cree_dyn = creation_dyn;
creation_dyn = false;
}
else
{
cree_dyn = true;
// dernier element a cree sur le tas
if( --nb_elem == 0 )
{
creation_dyn_tb = false;
}
}
}
et ça à l'air de marcher.
En multi-thread c'est aléatoire, ça peut ne pas marcher si un thread
cree un tableau sur le tas
tant dis qu'un autre en crée un sur la pile puisqu'ils utilise la même
variable
statique.
Si j'ai bien compris, le std::set sert à la construction pour verifier
le valeur de this avec celle du set?
Si on la trouve on peut déduire si l'objet est créé sur le tas ou p as.
[...]
Ca marche plutot bien en apparence, et je me sert de cette classe
comme base pour le polymorphisme.
C'est que tu n'en as pas essayé les cas que j'ai énumérés
ci-dessus.
Effectivement je n'ai pas essayé les creations avec new[] ,
ni en multi-thread Dans ces cas là, existe -il une solution ?
Oui, mais elle n'est pas tout légère. À chaque allocation, tu en
mets l'adresse renvoyée dans un std::set, à chaque libération,
tu l'enlève, et pour savoir, tu la cherches dans le std::set.
(Tu peux remplacer std::set par n'importe quelle collection,
évidemment. Mais de préférence une qui supporte directement
l'accès associatif.)
J'ai modifé mon code pour allouer des tableaux et garder
la trace de l'allocation sur la tas et je n'ai pas rencontré de pb.
dans ma classe j'ai ajouté 2 variables statiques, un qui indique un
utilisation de la fonction new[] et un qui compte le nombre
d'elements
alloués.
void* operator new[]( unsigned bytes )
{
nb_elem = bytes / sizeof(CBase1) ;
creation_dyn_tb = true;
void* result = ::operator new [] ( bytes );
return result;
}
void operator delete[]( void* p )
{
::operator delete[]( p);
}
ensuite dans le constructeur chaque élèment note s'il est créé
sur le tas ou pas:
CBase1::CBase1(const std::string& name)
: m_name(name)
{
if ( creation_dyn_tb == false )
{
cree_dyn = creation_dyn;
creation_dyn = false;
}
else
{
cree_dyn = true;
// dernier element a cree sur le tas
if( --nb_elem == 0 )
{
creation_dyn_tb = false;
}
}
}
et ça à l'air de marcher.
En multi-thread c'est aléatoire, ça peut ne pas marcher si un thread
cree un tableau sur le tas
tant dis qu'un autre en crée un sur la pile puisqu'ils utilise la même
variable
statique.
Si j'ai bien compris, le std::set sert à la construction pour verifier
le valeur de this avec celle du set?
Si on la trouve on peut déduire si l'objet est créé sur le tas ou p as.
[...]Ca marche plutot bien en apparence, et je me sert de cette classe
comme base pour le polymorphisme.
C'est que tu n'en as pas essayé les cas que j'ai énumérés
ci-dessus.
Effectivement je n'ai pas essayé les creations avec new[] ,
ni en multi-thread Dans ces cas là, existe -il une solution ?
Oui, mais elle n'est pas tout légère. À chaque allocation, tu en
mets l'adresse renvoyée dans un std::set, à chaque libération,
tu l'enlève, et pour savoir, tu la cherches dans le std::set.
(Tu peux remplacer std::set par n'importe quelle collection,
évidemment. Mais de préférence une qui supporte directement
l'accès associatif.)
J'ai modifé mon code pour allouer des tableaux et garder
la trace de l'allocation sur la tas et je n'ai pas rencontré de pb.
dans ma classe j'ai ajouté 2 variables statiques, un qui indique un
utilisation de la fonction new[] et un qui compte le nombre
d'elements
alloués.
void* operator new[]( unsigned bytes )
{
nb_elem = bytes / sizeof(CBase1) ;
creation_dyn_tb = true;
void* result = ::operator new [] ( bytes );
return result;
}
void operator delete[]( void* p )
{
::operator delete[]( p);
}
ensuite dans le constructeur chaque élèment note s'il est créé
sur le tas ou pas:
CBase1::CBase1(const std::string& name)
: m_name(name)
{
if ( creation_dyn_tb == false )
{
cree_dyn = creation_dyn;
creation_dyn = false;
}
else
{
cree_dyn = true;
// dernier element a cree sur le tas
if( --nb_elem == 0 )
{
creation_dyn_tb = false;
}
}
}
et ça à l'air de marcher.
En multi-thread c'est aléatoire, ça peut ne pas marcher si un thread
cree un tableau sur le tas
tant dis qu'un autre en crée un sur la pile puisqu'ils utilise la même
variable
statique.
Si j'ai bien compris, le std::set sert à la construction pour verifier
le valeur de this avec celle du set?
Si on la trouve on peut déduire si l'objet est créé sur le tas ou p as.
Être multithread sans s'en apercevoir est une façon sûr d'avoir
une application qui ne marche pas.
Être multithread sans s'en apercevoir est une façon sûr d'avoir
une application qui ne marche pas.
Être multithread sans s'en apercevoir est une façon sûr d'avoir
une application qui ne marche pas.
"James Kanze" writes:Le hardware du PDP-11 mettait une forte penalité si char n'était pas
signé. Du coup, char est signé sous tous les Unix que je connais,
AIX a un char non signé.
"James Kanze" <james.ka...@gmail.com> writes:
Le hardware du PDP-11 mettait une forte penalité si char n'était pas
signé. Du coup, char est signé sous tous les Unix que je connais,
AIX a un char non signé.
"James Kanze" writes:Le hardware du PDP-11 mettait une forte penalité si char n'était pas
signé. Du coup, char est signé sous tous les Unix que je connais,
AIX a un char non signé.