【发布时间】:2015-11-10 02:44:58
【问题描述】:
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;
【问题讨论】:
-
为什么不直接发送 Intx4 参考?这比 C++ 更像 C,除了 alignas
-
我只是想知道如何表达从未对齐的内存地址读取 int。
-
当心,从未对齐的地址读取 int 会在某些架构 (ARM) 上引发异常,并且在所有 C++ 版本中都是明确未定义的行为。
-
@SergeBallesta:由于 C++ 仅开始指定从 C++11 开始的内存模型,我会质疑您关于未对齐内存地址导致未定义行为的说法。在 C++11 中甚至不是这样。
-
@IInspectable,内存模型描述了内存操作在存在多个线程的情况下如何表现,但这与这里无关。对齐要求一直是 C++ 的一部分。