キャッシュ境界で型をオーバーアラインしたいので、次を使用しましたalignas
。
struct alignas(64) W { };
これはうまくコンパイルされます。しかし、驚いたことに、一連の s を割り当てようとするとW
、それらは 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) で。調子はどう?整列するように言ったのに、なぜ整列しないのですか?