
Nope, this is totally wrong! chars and arrays of type char are generally the least aligned objects. You can demonstrate that this doesn't work with something like this: void blah() { char c[/* some number */]; any<8> a((double)1.0); std::cout << &a << std::endl; } Tweak the size of c[] until you get &a % 8 != 0. Some compilers optimize stack layout, over-aligning data, but this is true only for SOME compilers on SOME processors with SOME optimization settings. (You can also experiment by defining an additional char variable before the buffer in your any. Where does &a.buffer lie?) I think you are misreading 3.9.2: it is talking about pointers, namely that void * and char * have the same storage and alignment requirements. On Wed, 10 Aug 2005 20:27:16 +0200, <boost-request@lists.boost.org> wrote:
From: "christopher diggins" <cdiggins@videotron.ca> To: "Boost mailing list" <boost@lists.boost.org> Sent: Wednesday, August 10, 2005 1:30 AM Subject: [boost] alignment problem in proposed any alternative
The question I have is whether in practice though are there are any compilers which have stricter alignment requirements on small types (<= sizeof(void*)) than a void pointer. In other words, is it possible with any known compiler to actually throw the runtime error ? Now a moot point, see below.
Unfortunately there is another problem, I am not an expert in interepreting the standard, but AFAICT placement new is guaranteed to return a pointer to properly aligned memory (3.7.3.1 / 2) which I leverage to check that alignment occured. Apparently not every STL implementation does in fact do that (I believe at least dinkumware is guilty of that). Apparently I am wrong about this! 18.4.1.3 provides an exception. (I wonder why I missed the exception 15 chapters later?) Anyway it turns out we can guarantee alignment by simply using a char buffer. According to 3.9/2 the following automatically has no alignment problems: template<int buffer_size> struct any { char buffer[buffer_size]; ... template<typename T> any(const T& x) { if (boost::is_pod<T>::value && (sizeof(T) <= buffer_size)) { memcpy(buffer, &T, N); } else { // new and stuff } } } Christopher Diggins
-- Using Opera's revolutionary e-mail client: http://www.opera.com/m2/