我想在缓存边界上过度对齐我的类型,所以我使用了alignas
:
struct alignas(64) W { };
这编译得很好。但是,令我惊讶的是,当我尝试分配一堆W
s 时,它们不是 64 字节对齐的,而是实际上是 16 字节对齐的:
#include <iostream>
#include <iomanip>
#include <unordered_map>
struct alignas(64) W { };
int main() {
std::unordered_map<int, int> offset;
for (int i = 0; i < 1000; ++i) {
auto w = new W;
offset[(uintptr_t)w % 64]++;
}
for (const auto& p : offset) {
std::cout << p.first << ' ' << p.second << '\n';
}
}
产量:
0 250
16 250
32 250
48 250
在几个编译中(gcc 4.8.2、gcc 5.2.0、clang 3.7.1)。这是怎么回事?我告诉它对齐,为什么它不对齐?