voglio overalign mio tipo su un limite di cache, quindi ho usato alignas
:alignas parola chiave non rispettati
struct alignas(64) W { };
Questo compila bene. Ma poi, con mia sorpresa, quando cerco di assegnare un gruppo di W
s, non sono di 64 byte allineati, ma in realtà a 16 byte allineati:
#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';
}
}
Resa:
0 250
16 250
32 250
48 250
su diverse compilazioni (gcc 4.8.2, gcc 5.2.0, clang 3.7.1). Che cosa succede? Ho detto di allineare, perché non si sta allineando?
["È definito dall'implementazione se i tipi sovraallineati sono supportati (\ [basic.align \])."] (Http://eel.is/c++draft/expr.new#1). Vedi anche [numero CWG 2130] (http://wg21.link/cwg2130). –
@ T.C. Sembra che dovrebbe essere una risposta. – NathanOliver
@ T.C. Come faccio a sapere se un'implementazione lo supporta (apparentemente né gcc né clang do) – Barry