如何指定指向未对齐int的指针?

时间:2015-08-17 12:46:00

标签: c++ c++11 alignas

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;

3 个答案:

答案 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

Unaligned pointers in C and C++ code