struct Intx4 {
int data[4];
};
Intx4 loadIntx4(void const *p) {
auto up alignas(1) = (int const *)p; // Does this line correct? (compiled ok in clang)
Intx4 r;
for (int i = 0; i < 4; i++) r.data[i] = up[i];
return r;
}我还尝试了以下代码,它们都无法在clang中编译:
int const *up alignas(1) = (int const *)p;
auto up = (int const alignas(1) *)p;发布于 2015-08-17 21:27:41
要读取未对齐整数,请执行以下操作:
int i;
void* ptr_to_unaligned;
...
memcpy (&i, ptr_to_unaligned, sizeof(i));C++中没有未对齐的整数类型,所以只能凑合使用void*。
发布于 2015-08-17 21:29:13
根据C++11草案(n4296),尝试将空指针转换为具有对齐要求的类型会调用未定义的行为
从5.2.9静态转换§13:“指向cv1空的指针”类型的Pr值可以转换为“指向cv2 T的指针”类型的Pr值,其中T是对象类型,cv2是与cv1相同或更高的cv限定...如果原始指针值表示内存中一个字节的地址A,并且A满足T__的对齐要求,则产生的指针值表示与原始指针值相同的地址,即A。任何其它此类指针转换的结果未指定(强调我的)
我知道您正在使用显式转换(或C风格的转换),但是5.4显式转换说明:由const_cast (5.2.11)、static_cast (5.2.9)、static_cast后跟const_cast、reinterpret_cast (5.2.10)或reinterpret_cast后跟const_cast执行的转换可以使用显式类型转换的cast表示法来执行。同样的语义限制和行为也适用于...
因此,在您的示例中,显式类型转换与static_cast<int const *>(p)相同。
一些体系结构,特别是ARM体系结构,在尝试访问that other SO answer中所说的未对齐的整型指针时会陷入陷阱
发布于 2018-09-08 20:55:17
要以未对齐的方式使用整数,请将单词__packed放在整数指针声明的前面:
__packed int *pi; // pointer to unaligned intUnaligned pointers in C and C++ code
https://stackoverflow.com/questions/32050802
复制相似问题