2017-02-20 2 views
0

Ich entwerfe eine Klasse, die die Benutzermanipulationen in einer Software verfolgt, um frühere Anwendungszustände wiederherzustellen (d. H. STRG + Z/STRG + Y). Ich wollte gerne etwas über Aufführungen klären.Liste Speichern von Zeigern oder "einfaches Objekt"

Ich verwende den std::list Container der STL. Diese Liste enthält nicht wirklich große Objekte, sondern eine signifikante Anzahl. Soll ich Zeiger verwenden oder nicht?

Zum Beispiel, hier sind die Arten von Objekten, die gespeichert werden sollen:

struct ImagesState 
{ 
    cv::Mat first; 
    cv::Mat second; 
}; 

struct StatusBarState 
{ 
    std::string notification; 
    std::string algorithm; 
}; 

Vorerst speichere ich das Ganze in Form von struct Zeigern, wie zum Beispiel:

std::list<ImagesStatee*> stereoImages; 

Ich weiß (denke ich), dass die Operatoren new und delete zeitaufwendig sind, aber ich möchte keinen Stapelüberlauf mit "normalem Objekt" erleben. Ist es ein schlechtes Design?

+1

Pointers sind in der Regel nicht erforderlich, außer für Polymorphismus. Werte speichern (Objektinstanzen, keine Zeiger auf sie). Und denken Sie daran, dass "std :: vector" der "Standard-Container" sein sollte. –

+1

Mit diesem gesagt, * wenn * Sie sowieso für Zeiger entscheiden, verwenden Sie die neuen Smartpointer, die in C++ 11 eingeführt wurde. –

+0

@Someprogrammerdude 'Smart Pointer' ja aus Sicherheitsgründen. – Papipone

Antwort

1

Wenn Sie eine Liste verwenden, würde ich vorschlagen, den Zeiger nicht zu verwenden. Die Listenelemente befinden sich sowieso auf dem Heap und der Zeiger fügt nur eine unnötige Ebene der Indirektion hinzu.

Wenn Sie nach der Leistung sind, ist die Verwendung von std :: list wahrscheinlich nicht die beste Lösung. Die Verwendung von std :: vector könnte Ihre Leistung erheblich steigern, da die Objekte besser für Ihre Caches sind. Auch in einem Vektor würden die Objekte auf dem Heap liegen und daher werden die Zeiger nicht benötigt (sie würden Ihnen sogar mehr schaden als bei einer Liste). Sie müssen sich nur um sie kümmern, wenn Sie ein Array auf Ihrem Stack erstellen.

wie so:

Type arrayName[REALLY_HUGE_NUMBER] 
+0

'Wenn Sie nach der Leistung sind, verwenden Sie std :: list' Ja, ich weiß, aber ich habe gehört, dass diese Liste eine bessere Leistung für die Insertion zeigen. Wie auch immer, ich muss kein Objekt mehr einfügen. Ich gehe mit Vektor. – Papipone

+0

'Die Listenelemente befinden sich sowieso auf dem Heap und der Zeiger fügt nur eine unnötige indirekte Ebene hinzu.' Wenn ich keine Zeiger verwende, ruft es dann meinen Objektkonstruktor auf, wenn ich push_back oder den Move-Konstruktor verwende? – Papipone

+1

Es hängt davon ab, ob Sie einen R-Wert oder L-Wert haben. Wenn Sie etwas tun wie: vector.push_back (ObjectType (param1, ..., paramn)); Es wird höchstwahrscheinlich den Move-Konstruktor aufrufen. Wenn Sie diesen Anruf speichern möchten, rufen Sie vector.emplace_back (param1, ..., paramn); Das wird das Objekt im Vektor konstruieren. Keine Kopie oder Bewegung danach benötigt. – OutOfBound

Verwandte Themen