
Andrey Melnikov <melnikov@simplexsoft.com> writes:
Each of them includes some extra operations which aren't necessary. Version 1 is terrible, version 2 uses an extra default construction, version 3 uses an extra memory allocation.
Here is a better version:
void foo( std::string * bar ) { new (bar) std::string("bar"); } ... char bar_placeholder[sizeof(std::string]; std::string *bar = reinterpret_cast<std::string*>(bar_placeholder);
reinterpret_cast is nonportable.
foo(bar); ... bar->~std::string();
It uses just one constructor call, no extra default constructors and no dynamic memory allocation. So far after reading the documentation, it seems to me that boost::optional provides a nice encapsuation for this bulk of code.
Or just an opportunity for premature optimization. On a compiler supporting RVO and other kinds of copy elision, the "terrible" version could be just as efficient, or more so. -- Dave Abrahams Boost Consulting www.boost-consulting.com