gpt4 book ai didi

c++ - 指针转换是否保持对齐属性?

转载 作者:IT王子 更新时间:2023-10-28 23:36:09 24 4
gpt4 key购买 nike

说,我有一个对齐的数组

alignas(X) char arr[sizeof(X)];

是指针

X * ptr = reinterpret_cast<X*>(arr);

保证按照X的对齐要求正确对齐?

情况似乎很明显,但从 C++ 标准来看似乎并不明显。

我在标准中找不到任何会阻止编译器对齐表单结构的内容

struct X
{
int16_t a;
int32_t b;
int16_t c;
};

像这样在内存中:

+-+-+-+-+-+-+-+-+
|a|a|b|b|b|b|c|c|
+-+-+-+-+-+-+-+-+
^
aligned to 32-boundary

以便 X 类型的对象以不需要填充的方式对齐,并且 b 同时正确对齐到 32 位边界.声明(N4713,§ 6.6.5.1)

An alignment is an implementation-defined integer value representing the number of bytes between successive addresses at which a given object can be allocated.

没有被违反,我在标准中没有看到任何其他违反它的声明。

最佳答案

您的结构应该有一个奇异的对齐方式:它应该是 16 位对齐但不是 32 位对齐。从数学上讲,它的地址应该是 32*n+16 的形式,其中 n 是一个整数。

这是语言所禁止的,32 位对齐应该满足 16 位对齐。换句话说,任何 16 位对齐的结构都应该适合 32 位对齐的存储区域,但您的 16 位对齐结构不适合。见 [basic.align]/5 :

Alignments have an order from weaker to stronger or stricter alignments. Stricter alignments have larger alignment values. An address that satisfies an alignment requirement also satisfies any weaker valid alignment requirement.

关于c++ - 指针转换是否保持对齐属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56240414/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com