2016-05-13 9 views
2

Lassen Sie uns sagen, dass wir diese Struktur mit 4 float Werte und eine float Array mit 4 Elementen.ein Array als struct vs undefinierten Verhalten Zugriff auf

Ist es dann nicht definiertes Verhalten oder das Array nicht als Foo Instanz zugreifen und die Array-Elemente durch diese Instanz ändern?

struct Foo 
{ 
    float a; 
    float b; 
    float c; 
    float d; 
}; 

float values[4] = { 1.0f, 1.0f, 1.0f, 1.0f }; 

int main() 
{ 
    auto& floats = *reinterpret_cast<Foo*>(values); 
    floats.a = 0.0f; 
    floats.b = 0.0f; 
    floats.c = 0.0f; 
    floats.d = 0.0f; 
} 

Kompilieren und Ausführen online: http://cpp.sh/6y7m

+2

Aufruf strikter Aliasing, striktes Aliasing, wir haben einen Anruf auf Linie 7. – Yakk

+0

Wie kann das wohl klar definiert sein? Zwischen den einzelnen Klassenmitgliedern kann es zu willkürlichen Abständen kommen. –

+0

@LightnessRacesinOrbit richtig. Wollte das in schwarz und weiß :) –

Antwort

4

Ja, es ist ein nicht definiertes Verhalten in der Tat. Es verletzt so genannte strenge Aliasing-Regel -, die den Zugriff auf das Objekt über unabhängige Zeiger verbietet (Ich werde nicht in Details wohnen, was nicht verwandten hier, es sei denn, ausdrücklich darum gebeten).

jedoch eine Reihe von Hin- und Herbewegungen auf eine struct ist unabhängig. Hier

ist ein Auszug aus Standard (3,10/10):

Wenn ein Programm versucht, den gespeicherten Wert eines Objekts durch eine glvalue anderer zuzugreifen als einer der folgenden Typen ist das Verhalten undefined:

- der dynamische Typ des Objekts,

- eine cv-qualifizierte Version des dynamischen Typ des Objekts,

- eine Art ähnlich (wie in 4.4 definiert) an den dynamischen Typ des Objekts,

- ein Typ, der die mit oder ohne Vorzeichen-Typ entsprechend dem dynamischen Typ des Objekt ist,

- ein Typ, der mit oder ohne Vorzeichen Typ entsprechend eine cv-qualifizierte Version des dynamischen Typ des Objekts,

- ein Aggregat oder Union Typ, die eine der vorher erwähnten Typen unter seinen Elementen oder nicht-statischen Datenelemente umfasst (einschließlich, rekursiv, ein Element oder ein nicht-statisches Datenelement einer Unteraggregat oder enthaltenen Union)

- ein Typ, der ein (möglicherweise cv-qualifiziert) Basisklassentyp der dynamische Typ des Objekts,

- ein Char oder unsigned Char-Typ.

+0

Könnten Sie bitte näher ausführen?Oder vielleicht verweisen Sie mich auf die relevanten Abschnitte im Standard? Vielen Dank! –

+0

@JohannGerell, meine Lieblingssektion :) Gib mir 3 Minuten. – SergeyA

+0

Danke für die Ausarbeitung "nicht verwandt" - ich hatte diese Ahnung auch. –

Verwandte Themen