Frage

Ich experimentiere mit OpenCL die Geschwindigkeit unserer Software zu erhöhen. Wir arbeiten mit Karten viel und zu vereinfachen, stellt eine Karte als std :: vector . Die OpenCL API nimmt rohen c-Stil Zeiger als Argumente, zum Beispiel int * im Fall oben.

Meine Fragen:

  • Gibt es Implementierung Garantien im stl dass Vektor ist, intern, in Folge im Speicher?
  • Kann ich warf sicher ein std :: vector zu int * und erwarten, dass zur Arbeit?
  • Im Fall eines Vektors von Vektoren, kann ich davon ausgehen, noch das wahr hält? Ich würde den Vektor erwarten, dass andere Zustandsdaten zu halten, oder Ausrichtungsprobleme, oder vielleicht etwas anderes ...
  • Was ist der beste Weg, um diesen Ansatz? Schreibe eine benutzerdefinierte 2D-Datenstruktur, die einen inneren, zusammenhängenden-in-Speicher-Puffer und die Arbeit mit dem gilt? Ich würde zu / von Vektoren viel ...
  • kopieren

Danke.

War es hilfreich?

Lösung

  

Gibt es Implementierung Garantien im stl dass Vektor ist, intern, in Folge im Speicher?

Wie von C ++ 03, ja, ein Vektor ist garantiert zusammenhängenden Speicher zu verwenden. (In C ++ 98, war es ein zufälliges Schlupfloch so eine Implementierung hypothetisch nicht zusammenhängende Speicher verwenden kann, aber es war in der 2003 Revision der Norm festgelegt - und keine Implementierung tatsächlich verwendet nicht zusammenhängende Lagerung, weil es eine schreckliche Idee sein würde)

  

Kann ich warf sicher ein std :: vector zu int * und erwarten, dass zur Arbeit?

Der üblicher Weg ist &v[0]. (&*v.begin() würde wahrscheinlich arbeiten, aber ich glaube ich zu erinnern, gibt es einige flauschige Formulierung in dem Standard, der diese nicht 100% zuverlässig macht)

Nein. Warum würden Sie das an der Arbeit erwarten? Ein Vektor ist eine Klasse. Es ist kein Zeiger. Es ist einfach enthält ein Zeiger.

  

Im Fall eines Vektors von Vektoren, kann ich davon ausgehen, noch das wahr hält? Ich würde erwarten, dass der Vektor andere Zustandsdaten oder Ausrichtungsprobleme zu halten, oder vielleicht etwas anderes ...

Der Vektor verhält sich das gleiche, was Sie darin speichern. Wenn Sie einen Vektor von Vektoren bilden, man mit einem Objekt, das am Ende einen Zeiger auf einen zugewiesene Heap-Array enthält, wobei jedes Element ein Objekt, das einen Zeiger auf eine Halde zugeordnete Array enthält.

Was, wie Sie diesen Ansatz sollen, hängt es von vielen Faktoren ab. Wie groß ist Ihre Gesamtdatenmenge? Vielleicht möchten Sie die gesamte Tabelle zusammenhängend zugewiesen haben. Mit einem Vektor der Vektoren, ist jede Zeile eine separate Zuweisung.

Andere Tipps

  
      
  • Gibt es Implementierung Garantien im stl dass Vektor ist,
      intern, in Folge im Speicher
  •   

Ja, es ist ein dynamisches Array. Standard garantiert, dass die Objekte in Vektor nacheinander gespeichert.

  
      
  • Kann ich warf sicher ein std :: vector zu int * und erwarten, dass zur Arbeit?
  •   

Nein, aber Sie verwenden können, beginnen () und verwenden, die als Zeiger.

  
      
  • Gibt es Implementierung Garantien im stl dass Vektor ist,
      intern, in Folge im Speicher
  •   

Nein, da Vektor einigen internen Membervariablen das gesamte 2D-Arrays enthalten kann nicht Kontinuierlich Speicherplatz

sein
  

Gibt es Implementierung Garantien im stl dass Vektor ist, intern, in Folge im Speicher?

Auch wenn ich nicht die Standards hier zitieren, die ich gesehen habe Code in qualitativ hochwertigen Bibliotheken unter der Annahme dieses Layouts (nämlich POCO ).

  

Kann ich warf sicher ein std :: vector zu int * und erwarten, dass zur Arbeit?

Im Einzelnen können Sie den Vektor selbst nicht neu gefasst. Aber ich habe den folgenden Code zu sehen:

std::vector<int> vec;
int* ptr = &vec[0];
  

Im Fall eines Vektors von Vektoren, kann ich davon ausgehen, noch das wahr hält? Ich würde erwarten, dass der Vektor andere Zustandsdaten oder Ausrichtungsprobleme zu halten, oder vielleicht etwas anderes ...

Sie können sich wahrscheinlich werfen nicht einen Vektor von Vektoren zu einer linearen Anordnung. Jeder Vektor wird seinen eigenen Speicherbereich reservieren, und Sie können nicht alle diese Bereiche erwarten Sequencial sein.

hat Sie in einem Kommentar, dass Sie mit bis zu 2500x2500xsizeof (double) Daten arbeiten. In diesem Fall würde ich vorschlagen, einen einzigen Vektor anstelle von Vektor von Vektoren verwendet. Zuteil NxM Elemente in einem Vektor und wickeln Sie es in einer Klasse aussetzt zweidimensionale Indizierung, wenn Sie möchten. Sie erhalten alle Vorteile der Vektor mit minimalem Overhead und alle Ihre Daten sind noch in zusammenhängenden Speicher für die schnelle Verarbeitung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top