2014-02-06 7 views
7

dies sicher ist oder geschieht dies nur auf meinem aktuellen Compiler zu arbeiten? Gibt es im Standard etwas darüber? Das Ergebnis im Floats-Vektor ist korrekt.Memcpy Daten von std :: vector zugrunde liegenden Objekte

class Color { 
public: 
    Color(float r, float g, float b, float a) : mColor{r,g,b,a} {}; 

    inline const float *data() const 
    { 
    return mColor; 
    } 

private: 
    enum {vectorSize = 4}; 
    float mColor[vectorSize]; 
}; 

//test 
std::vector<Color> colors(2); 
std::vector<float> floats(8); 
colors[0] = Color(0.1, 0.2, 0.3, 0.4); 
colors[1] = Color(0.5, 0.6, 0.7, 0.8); 
memcpy(floats.data(), colors.data(), 8 * sizeof(float)); 
+3

wird es funktioniert mit trivialer kopierbar Objekt nur (http://en.cppreference.com/w/cpp/types/is_trivially_copyable). Sie sollten 'std :: bevorzugen copy' oder' std :: copy_n' – galop1n

Antwort

8

Es ist garantiert

Vom Standard

arbeiten

23.3.6.1 Klasse Vorlage Vektor Übersicht

Ein Vektor eine Sequenz-Container ist, die zufällige Access-Iteratoren unterstützt. Darüber hinaus unterstützt es (amortisiert) konstante Zeit Einfügen und Löschen von Operationen am Ende; Einfügen und Löschen in der Mitte nehmen lineare Zeit. Die Speicherverwaltung wird automatisch durchgeführt, es können jedoch Hinweise zur Verbesserung der Effizienz gegeben werden. Die Elemente eines Vektors werden zusammenhängend gespeichert, was bedeutet, dass, wenn v ein Vektor ist, wo T eine Art andere als Bool ist, dann ist es die Identität gehorcht & v [n] == & v [0] + n für alle 0 < = n < v.größe().

Alle PODs sind trivialer kopierbar

+4

, die nicht seinen Code garantiert funktionieren wird. Was sichert 'sizeof (Color) == (4 * sizeof (float))'? Wenn das nicht stimmt, bricht sein Code fürchterlich. –

+0

Genau deshalb war ich mir nicht sicher. Aber warum wäre es nicht gleich 4 * sizeof (float)? – cboe

+1

Als Farbe jetzt geschrieben wird, wird die Größe einer Farbe OBJ sein '4 * sizeof (float)'. Allerdings könnte Color leicht so geändert werden, dass dies nicht mehr zutrifft. Ich glaube, dass dieser Code garantiert funktioniert wie geschrieben, aber es ist sehr spröde. – hifier

Verwandte Themen