Vor kurzem bin ich in meiner Anwendung auf ein Problem gestoßen, das meiner Meinung nach auf eine falsche Freigabe zurückzuführen ist, und ich habe nachgeschaut Sutters Artikel wie ich meine Daten an Cache-Zeilen ausrichten kann. Er schlägt den folgenden C++-Code vor:
// C++ (using C++0x alignment syntax)
template<typename T>
struct cache_line_storage {
[[ align(CACHE_LINE_SIZE) ]] T data;
char pad[ CACHE_LINE_SIZE > sizeof(T)
? CACHE_LINE_SIZE - sizeof(T)
: 1 ];
};
Ich kann mir vorstellen, wie das funktionieren würde, wenn CACHE_LINE_SIZE > sizeof(T)
wahr ist - die Struktur cache_line_storage
nur eine volle Cache-Zeile des Speichers beansprucht. Wenn jedoch die sizeof(T)
größer als eine einzelne Cache-Zeile ist, sollten wir die Daten um CACHE_LINE_SIZE - T % CACHE_LINE_SIZE
Bytes, so dass die resultierende Struktur eine Größe hat, die ein ganzzahliges Vielfaches der Cache-Zeilengröße ist. Was ist an meinem Verständnis falsch? Warum reicht das Auffüllen mit 1 Byte aus?