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.
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"