E
ena8t8si
Keith said:Dave said:To be pedantic, alignof (unsigned char [4]) % alignof (unsigned int)
== 0. Although it is clearly expected and normally true that stricter
alignments (if they exist at all) are multiples of all looser ones,
that isn't explicitly required; a perverse (DS9k) implementation could
align char[4] to 3 and int to 5.
[...]
Actually, I don't think it could. int could have an alignment of 5,
but char[4] can't have a required alignment of 3. Given:
char arr[2][4]
the two elements of arr must be adjacent and must each have a size of
4 bytes.
Oops, you're right. I didn't think far enough.
In general, because there can't be gaps between array elements, the
size of a type must be a multiple of its alignment. (The
implementation can adjust the size if necessary to make this happen,
for example by adding padding bits.)
Except to character types, or at least unsigned char and thus possibly
plain char. And, by the reasoning above, arrays of them.
But I still maintain in the example upthread int could (perversely)
require an alignment not supplied by char[4].
Are you saying anything more than, eg, char[4] can
require four byte alignment whereas int could allow
alignment of either 0 or 2 mod 4? Certainly the
set of alignments allowed for int must have some
overlap with the set of alignments allowed for
char[4].
int could have an alignment of, say, 5. If char[4] required an
alignment of 4, then a union of an int and a char[4] would require an
alignment of at least 20.
My assumption was the earlier context stipulated an
int of size 4. If int were of size 5 then I agree
with your comment. Also note, my comment was only
an example.
But I'm not sure that char[4] can require an alignment stricter than 1
byte. For example, this:
char buf[5];
char (*p)[4] = (char(*)[4])(buf+1);
make p a pointer to a char[4] array that aliases elements 1..4 of buf.
Is this guaranteed to make p a valid pointer?
I believe the Standard does not guarantee p will be valid,
either directly or indirectly. And, to draw the conclusion,
the guarantee of validity would need to be explicit.
More generally, may an array of type X have a stricter alignment
requirement than type X itself?
Yes, I believe it may, provided the array has a defined
array bound that is greater than one.
An implementation may, of course, choose to align a char array, or
even a single char object, on, say, a word boundary; the question is
whether it can require such strict alignment.
Yes; unless there is specific language that shows
such an alignment can't be required, it can be
required. I'm not aware of any such language for
arrays of length greater than one.