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;
答案 0 :(得分:3)
读取未对齐的整数:
int i;
void* ptr_to_unaligned;
...
memcpy (&i, ptr_to_unaligned, sizeof(i));
C ++中没有未对齐的整数类型,因此您必须使用void*
。
答案 1 :(得分:3)
尝试将指向void的指针转换为具有对齐要求的类型会调用未定义的行为,根据C ++ 11草案(n4296)
从5.2.9静态强制转换§13:类型为“指向cv1 void的指针”的prvalue可以转换为类型为“指向cv2 T的指针”的prvalue,其中T是 对象类型和cv2是相同的cv-qualification,或者比cv1更高的cv-qualification ...如果原始指针值代表 内存中一个字节的地址A和 A满足T 的对齐要求,然后是结果指针 value表示与原始指针值相同的地址,即A.任何其他此类指针转换的结果未指定(强调我的)
我知道你使用的是显式强制转换(或C风格的强制转换),但5.4显式强制转换说:由const_cast(5.2.11),static_cast(5.2.9),static_cast执行的转换然后是const_cast,reinterpret_cast(5.2.10),或者是一个后面跟着const_cast的reinterpret_cast, 可以使用显式类型转换的强制转换表示法执行。相同的语义限制和行为适用于......
因此,在您的情况下,显式强制转换与static_cast<int const *>(p)
相同。
当你尝试访问未对齐的int指针时,有些架构,特别是ARM架构会被捕获,如that other SO answer中所述
答案 2 :(得分:0)
要以未对齐的方式使用整数,请将__packed放在整数指针声明的前面:
__packed int *pi; // pointer to unaligned int