2016-12-04 6 views
0

Ich schreibe Code für GPUs, deshalb kann ich keine STL-Klassen verwenden, weil Methoden spezielle Anmerkungen benötigen, um auf der GPU zu laufen. So, ich bin mit passenden Anmerkungen (INLINE) auf seinen Methoden neu implementieren. Das Problem, das ich jetzt habe, ist mein Copykonstruktor den Zuweisungsoperator auf Mitglieder aufruft:std :: array-like class Kopie Konstruktor

template <typename T, Int n> 
class Few { 
    T array_[n]; 

public: 
    INLINE Few(Few<T, n> const& rhs) { 
    for (Int i = 0; i < n; ++i) array_[i] = rhs.array_[i]; 
    } 
}; 

das in Ordnung für einfache T funktioniert, aber es ist eine Art, für die dieser den Kopierkonstruktor aufrufen muss, nicht den Zuweisungsoperator . Wie bekomme ich den Compiler, um jedes Element im Array zu konstruieren?

+0

Would [std :: uninitialized_copy_n] (http://en.cppreference.com/w/cpp/memory/uninitialized_copy_n) arbeiten? – fun4jimmy

+0

@ fun4jimmy fast. es ist nicht für GPUs annotiert, aber ich habe seine Implementierung kopiert und das hat funktioniert. –

+2

Eigentlich wurde Array_ bereits standardmäßig initialisiert, so dass es wahrscheinlich nicht gültig ist, uninitialized_copy_n zu verwenden. – fun4jimmy

Antwort

-3

Es scheint, als ob die Verwendung des Placement-New-Operators ausgearbeitet wurde. Ich bin mir nicht sicher, dass dies je die C++ Standard völlig legitim ist, aber hier ist es:

INLINE Few(Few<T, n> const& rhs) { 
    for (Int i = 0; i < n; ++i) new (array_ + i) T (rhs.array_[i]); 
    } 
+0

Wenn Sie Placement-neu anrufen müssen, sollten Sie den dtor wahrscheinlich auch manuell aufrufen. – Deduplicator

+2

Was passiert, wenn der Standardkonstruktor des Typs T etwas Speicher zuweist? Ich denke, das Aufrufen einer neuen Platzierung auf einem bereits initialisierten Wert würde dazu führen, dass es ausläuft. – fun4jimmy

+3

Diese Lösung ist richtig, wenn und nur wenn Sie zu 'std :: aligned_storage_t Array wechseln;' oder 'alignas (T) char-Array [n * sizeof (T)];'. Wenn Sie "T array [n];" haben, dann ist das Aufrufen von placement new ein undefiniertes Verhalten, da der Compiler zuvor die Standardkonstruktoren für dieselben Objekte aufruft. – HolyBlackCat

8

Wie erhalte ich die Compiler jedes Element im Array kopieren konstruieren?

Es wird schon. Genau das wird der Standard-Kopierkonstruktor hier tun. So liefern nicht nur einen selbst, oder es ausdrücklich Standard:

Few(Few const&) = default; 
+0

es kommt alles auf diese 'INLINE' Annotation für GPUs. Die Standardkopiekonstruktion hat diese Annotation nicht, also brauchte ich eine explizite Entsprechung. –

Verwandte Themen