Can the alignment of a structure type be found if the alignments of the structure members are known?

Eg. for:

struct S
{
 a_t a;
 b_t b;
 c_t c[];
};

is the alignment of S = max(alignment_of(a), alignment_of(b), alignment_of(c))?

Searching the internet I found that "for structured types the largest alignment requirement of any of its elements determines the alignment of the structure" (in What Every Programmer Should Know About Memory) but I couldn't find anything remotely similar in the standard (latest draft more exactly).


Edited: Many thanks for all the answers, especially to Robert Gamble who provided a really good answer to the original question and the others who contributed.

In short:

To ensure alignment requirements for structure members, the alignment of a structure must be at least as strict as the alignment of its strictest member.

As for determining the alignment of structure a few options were presented and with a bit of research this is what I found:

  • c++ std::tr1::alignment_of
    • not standard yet, but close (technical report 1), should be in the C++0x
    • the following restrictions are present in the latest draft: Precondition:T shall be a complete type, a reference type, or an array of unknown bound, but shall not be a function type or (possibly cv-qualified) void.
      • this means that my presented use case with the C99 flexible array won't work (this is not that surprising since flexible arrays are not standard c++)
    • in the latest c++ draft it is defined in the terms of a new keyword - alignas (this has the same complete type requirement)
    • in my opinion, should c++ standard ever support C99 flexible arrays, the requirement could be relaxed (the alignment of the structure with the fl
Edit
Report