Warnung zu new mit align
-
Hi,
ich habe folgenden Code:struct A { alignas(64) int b; }; int main() { A *a = new A(); }
Wenn ich es mit
-Wall
kompiliere, bekomme ich folgende Warnung:In Funktion »int main()«: Warnung: »new« für Typ »A« mit erweiterter Ausrichtung 64 [-Waligned-new=] A *a = new A(); ^ Anmerkung: verwendet »void* operator new(long unsigned int)«, das jedoch keinen Ausrichtungsparameter hat Anmerkung: verwenden Sie »-faligned-new«, um die C++17-Unterstützung für überausgerichtetes New einzuschalten
Allerdings verstehe ich nicht genau, was mir die Warnung sagen will.
- Ist jetzt garantiert, dass
b
an einer durch 64 teilbaren Adresse im Speicher liegt? - Ich dachte, die runden Klammern
()
innew A()
bedeuten: "erzeige ein Object von A, das default contructed wird". Die Warnung klingt aber so, als würde ich eine Version von new benutzen, die einen "Ausrichtungsparameter" erwartet. Habe ich da etwas falsch verstanden?
Danke schon mal für hilfreiche Kommentare
- Ist jetzt garantiert, dass
-
asdfasd schrieb:
Ist jetzt garantiert, dass
b
an einer durch 64 teilbaren Adresse im Speicher liegt?Nein. Es sogar unwahrscheinlich.
asdfasd schrieb:
Ich dachte, die runden Klammern
()
innew A()
bedeuten: "erzeige ein Object von A, das default contructed wird". Die Warnung klingt aber so, als würde ich eine Version von new benutzen, die einen "Ausrichtungsparameter" erwartet. Habe ich da etwas falsch verstanden?Die normalen Signaturen für Allokations-/deallokationsfunktionen bis einschliesslich C++14 enthalten keinen Parameter, um eine bestimmte Ausrichtung zu fordern.
In C++17 ändert sich das, es gibt in diesem Standard zusätzliche Überladungen, die einen weiteren Parameter des Typs std::align_val_t erwarten. Diese Überladungen weren automatisch vom new- und delete-Operator aufgerufen, wenn das Argument einen entsprechend überausgerichteten Typ hat.
Vor C++17 ist das umständlicher: man kann zwar dem new-Operator zusätzliche Argumente mitgeben, der Aufruf der passenden Deallokationsfunktion ist dann aber umständlich, und automatisch gleich gar nicht (ein Grund mehr, Smartpointer zu verwenden).
-
Siehe P0035. Du hast offensichtlich versäumt, das
-std=c++1z
Flag mitzugeben, womit die Warnung auch verschwindet.Ist jetzt garantiert, dass b an einer durch 64 teilbaren Adresse im Speicher liegt?
Nein. Vor C++17 war die Unterstützung von over-aligned Typen nur conditionally supported.
Ich dachte, die runden Klammern () in new A() bedeuten: "erzeige ein Object von A, das default contructed wird".
Die Warnung klingt aber so, als würde ich eine Version von new benutzen, die einen "Ausrichtungsparameter" erwartet. Habe ich da etwas falsch verstanden?
Der Ausrichtungsparameter befasst sich mit der Ausrichtung (alignment) des Speichers. Hat mit der Initialisierung des Objekts (i.e. dem Inhalt des Speichers, wenn man so will) nichts zu tun.