Avatar
Posix
Člen
Avatar
Posix:
vector<MyClass> pool_;
size_t poolIndex_;
// ...
vector<MyClass*> stack;
stack.push_back(new (&pool_[poolIndex_++]) MyClass);

Zdar, s tímto jsem se myslím v C++ ještě nesetkal a netuším, co to dělá. Jde mi o to (&pool_[poolIn­dex_++]) mezi new a MyClass. Jakože vím co to dělá, ale nechápu, jak to může být mezi new a MyClass

Editováno 4.11.2014 17:09
Odpovědět 4.11.2014 17:08
Proč to dělat jednoduše, když to jde složitě.
Avatar
Odpovídá na Posix
Lukáš Hruda (Luckin):

Tomu se říká operátor new s umístěním (placement new). Vytvoří to objekt třídy na adrese kterou tomu operátoru předáš. Zde na adrese určené výrazem &pool_[poolIn­dex_++].

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
 
Nahoru Odpovědět 4.11.2014 17:20
Avatar
vitamin
Člen
Avatar
Odpovídá na Posix
vitamin:

je to placement new, v c++ je viacej verzii operatora new, standartne new bez parametrov alokuje pamet a nasledne zavola konstruktor, new s parametrom void* (to je ten co si ty pouzil) nealokuje pamet, ale zavola konstruktor pre dany parameter. Existuje este napr operator new ktory prebera parameter std::nothrow, takyto operator nevyhodi vynimku pri alokacii...

Co sa tyka toho kodu co si sem dal, je tam vela moznych chyb, vola sa viacnasobne konstruktor, pouzit vector ako memory pool tiez nieje dobry napad lebo vector sa moze realokovat na ine miesto v pameti...

Editováno 4.11.2014 17:40
 
Nahoru Odpovědět 4.11.2014 17:38
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 3 zpráv z 3.