Boost logo

Boost :

From: christopher diggins (cdiggins_at_[hidden])
Date: 2005-08-10 09:27:48


----- Original Message -----
From: "christopher diggins" <cdiggins_at_[hidden]>
To: "Boost mailing list" <boost_at_[hidden]>
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
http://www.cdiggins.com


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk