Wie kann man feststellen, ob eine Adresse im Cache ausgerichtet ist?

8

Gibt es eine C ++ 11-konforme (oder wenn nicht konform, zumindest allgemein akzeptierbare) Methode, um festzustellen, ob eine Adresse an einer Cache-Zeilengrenze ausgerichtet ist?

z. etwas wie das:

%Vor%     
atb 04.06.2014, 22:32
quelle

2 Antworten

3

Wenn Sie einen C ++ 11-kompatiblen Compiler haben, dann sagt Ihnen die Dokumentation.

Wie bereits von Igor in den Kommentaren erwähnt, beinhalten die Regeln für reinterpret_cast :

  

Ein Zeiger kann explizit in einen beliebigen integralen Typ konvertiert werden, der groß genug ist, um ihn aufzunehmen. Die Zuordnungsfunktion ist implementierungsdefiniert .

Dieser Begriff bedeutet nicht nur "nicht tragbar", sondern enthält auch spezifische Anforderungen, die in 1.3.10 gefunden wurden:

  

Implementierungswiderstehendes Verhalten

     

Verhalten, für ein wohlgeformtes Programmkonstrukt und korrekte Daten, die von der Implementierung abhängen und   dass jede Implementierung dokumentiert

Wenn Ihr Compiler nicht dokumentiert, ob ein in Integer konvertierter Zeiger tatsächlich eine Speicheradresse ist, dann ist es kein C ++ - Compiler.

    
Ben Voigt 06.06.2014, 19:07
quelle
3

Es gibt eine std::align -Funktion, aber es ist anscheinend nicht sehr gefragt: es fehlt in gcc 4.9 und in MSVC schlecht abgehört.

Die vorgeschlagene Implementierung (es ist kurz genug, um nur zu lesen) ist

%Vor%

... ein bisschen Overkill hier, denn um einfach nach einem bereits ausgerichteten Zeiger zu suchen, läuft es genau auf Ihre Methode hinaus (mit bitbashing nicht%, aber egal). Seine Implementierung ist, wie @IgorTandetnik darauf hinweist , "nicht überraschend für diejenigen, die die Adressierungsstruktur der zugrunde liegenden Maschine kennen"

    
jthill 06.06.2014 19:00
quelle

Tags und Links