Bonjour tout le monde,
prenons par exemple la structure:
j'ai du mal à comprendre la différence entre:Code:
1
2
3
4
5 struct A { A(); A( int ); };
etCode:A a(1);
Savez-vous quelque chose à ce sujet?Code:
1
2 A a; new(&a) A(1);
Version imprimable
Bonjour tout le monde,
prenons par exemple la structure:
j'ai du mal à comprendre la différence entre:Code:
1
2
3
4
5 struct A { A(); A( int ); };
etCode:A a(1);
Savez-vous quelque chose à ce sujet?Code:
1
2 A a; new(&a) A(1);
Dans le premier cas tu construit une fois un A avec le constructeur prenant un int,
dans le second tu constuits un A avec le constructeur par defaut puis une deuxieme fois avec le constructeur prenant un int sans detruire le premier.
Le new avec placement n'est pas fait pour ca, il est fait pour pouvoir utiliser initialiser un objet a un emplacement fixe qui devrait etre de la memoire brute obtenue par un autre moyen. Exemple d'utilisation typique, std::vector obtient un bloc de memoire contigu de taille reserve() objets mais n'a que size() objets construits. Tu fais un push_back, tu construits un nouvel objet avec une placement new a un emplacement reserve mais pas encore utilise. boost variant et boost optional sont d'autres exemples ou c'est vraisemblablement utilise.
Merci :D
Juste pour s'amuser, il semble que l'on puisse faire à peu près la même chose comme suit:
Ou encore:Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 #include <setjmp.h> jmp_buf env; struct A { int x; A(){ int val=setjmp(env); std::cout << "Hola " << val << "\n"; } }; main() { A a; longjmp(env,1); }
'sont fous ces espagnols :cfou:Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 #include <iostream> #include <ucontext.h> ucontext_t *ct,*ctorig,*dummy = NULL; struct A { int x; A(){ getcontext(ct); std::cout << "Hola " << "\n"; if (ctorig) swapcontext(dummy,ctorig); } ~A(){ std::cout << "Chau\n"; } }; int main() { ct = new ucontext_t; A a; ctorig = new ucontext_t; dummy = new ucontext_t; swapcontext(ctorig,ct); swapcontext(ctorig,ct); };
:)