Ich habe die folgenden API-Design-Problem, oder vielmehr dilemma.Ich suche eine Möglichkeit, einige Objekte in STL vector als Objekt zu speichern.Ja, suche ich nach einer Möglichkeit, Vektor-Traversing-Performance durch cache locality Verbesserung zu erhöhen. Nun ist die Sache, diese Art von Objekt sollte auch als nicht kopierbar für den Benutzer der API offen gelegt werden. Und ich meine implizite Kopie über Kopierkonstruktor oder Zuweisung. Aber wie Sie sicher wissen, etwas zu tun, wie folgt aus:Implizite Objektkopie selektiv deaktivieren
#define PREVENT_COPY(TypeName) \
TypeName (const TypeName &); \
void operator= (const TypeName &);
#endif
class FooClass
{
PREVENT_COPY(FooClass)
public:
FooClass() {}
~FooClass() {}
};
Und dann:
int main(int argc,char* argv[])
{
std::vector<FooClass> fooVec;
}
Wird nicht funktionieren, weil der Vektor ideal Zugriff auf copy constructor .So erfordert, ich möchte zu genießen In beiden Welten ist es möglich, den öffentlichen Zugriff auf den Kopier-/Zuweisungsmechanismus zu verhindern und gleichzeitig Objekte in den Vektor zu schieben. C-Array kann STL-Vektor ersetzen. Aber gibt es einen Hack, um es auch mit std :: vector in einem solchen Szenario zu arbeiten?
Als Randbemerkung: Der Grund, warum ich brauche für diese Art von Objekt implizit Kopie zu deaktivieren ist, dass es durch ein internes System verwaltet erstellt und ist, die für den gesamten Lebenszyklus von Objekten dieses Typs verantwortlich ist .Und derzeit cache ich diese in einem Vektor von Zeigern. Das Ziel sind mobile Plattformen und die App ist Echtzeit-Rendering-System. Ich möchte dynamische Zuordnungen zu minimieren und Cache-Lokalität für häufig durchlaufene Vektoren von leistungskritischen Daten zu verbessern.
Mit C++ 11 können Sie Move-Konstruktor verwenden (und weiterhin die Kopie nicht zulassen). – Jarod42
Und 'Freund' erlaubt" selektiv "Zugang zu privaten Methoden zu geben. – Jarod42
Move Konstruktor scheint zu sein, was ich brauche. Nie realisiert, dass es so einfach sein würde –