"Fernando Cacciola" <[EMAIL PROTECTED]> writes: >> >> There's no need to store p. You can just use >> static_cast<T*>(buffer.address()) >> > Yes.. I just shown the pointer explicitely. > The result of the static_cast<> is a pointer, so to obtain a reference (for > the operator*) you need to 'actually' dereference this poiner.
I have no idea what you're trying to say here. Could you try again? >> > OTOH, when T is a POD, so there is no need to bypass its ctor >> > (since it has a trivial ctor), >> > the implementation goes like this: >> > >> > template<class T> >> > class optional2 >> > { >> > optional2 ( T const& val ) v(val) {} >> > >> > T const& operator *() { return val; } // No Dereference here >> > >> > T val ; >> > } ; >> > >> > Anyway, if yoy know how to make an efficient implementation like >> > the second one with an aligned storage I'll be happy to use it. >> >> Why do you think that will be any more efficient than the other >> implementation when T is POD? >> > For POD types: operator*() "directly" returns the value. > The key is that for POD types, since optional wraps just T (unlike any > variant) and nothing else, aligned_storage is not required. > optional<> simply contains a data member of type T, that's all. Why do you think aligned_storage<T> will be any less-efficient than T when T is a POD? > If you still don't see it I can show you the typical machine > generated code for both implementations for operator*(). I'm not surprised the non-POD version is slower as long as you're storing a separate pointer. If you use the static_cast form I show above, there's no reason for it to be any worse, AFAICT. -- David Abrahams [EMAIL PROTECTED] * http://www.boost-consulting.com Boost support, enhancements, training, and commercial distribution _______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost