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

标签 c++ pointers memory alignment language-lawyer

说,我有一个对齐的数组

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/

相关文章:

c++ - 在声明和类名的定义中使用不同的类键是否合法?

java - 数组类型相同,链表类型不同

c++ - 如何释放由 "new"分配的内存,但不显式引用相应的指针

c - 在给定的用户定义函数中,求值顺序是否会无法将源字符串复制到目标字符串?

Android 内存不足位图

c - 分析C程序的内存使用情况

c++ - 如何使着色器淡入颜色?

c++ - 如何使用二叉索引树来计算小于索引值的元素数?

c - 访问结构中的字符指针字段

mysql - 在数据库中创建长度为 1 的 long varchar 没有意义吗?