Re: A portable way of pointer alignment
* Pavel:
Is there a portable C++-ish way to get a properly aligned pointer to an
object of given type from given arbitrary pointer-to-char? More
precisely, how to implement a template function with this prototype:
template <typename T>
T *
align(char *buf, size_t bufSize);
whose input is a memory buffer and output is either the lowest position
in the buffer at which one can placement-new an object of type T or a
null pointer if it is impossible?
It depends what you mean by portable.
If you mean "formally portable" then you can just wait a year or two or three
until C++0x, and then you have alignment as part of the standard library.
Until then I'm pretty sure that you'll find this functionality in the Boost
library (disclaimer 1: haven't checked).
But if you absolutely insist on doing it yourself, and the buffer does not stem
from an ordinary 'new' (which produces a pointer suitably aligned for any
ordinary type), and you're happy with a little formal UB, then you might try
something like
<code>
typedef ptrdiff_t Size;
template< typename T >
inline Size alignmentOf()
{
struct X
{
char bah;
T t;
};
return offsetof( X, t );
}
template <typename T>
T* align( char* const buf, Size const bufSize)
{
Size const i = reinterpret_cast<Size>( buf );
Size const j = i + alignmentOf<T>() - 1;
Size const aligned = j - j % alignmentOf<T>();
return (aligned - i >= bufSize - sizeof(T)? 0 : reinterpret_cast<T*>(
aligned ) );
}
</code>
(disclaimer 2: not tested! :-) )
Cheers & hth.,
- Alf