aus Vector Array machen



  • @pale dog: Mhhh, ja das habe ich auch schon bei Google gefunden. Allerdings gibt dies ja nur die Adresse des ersten Elements des Vectors wieder. Wenn die weiteren Elemente des Vectors nicht direkt hinter dem ersten Element im Speicher liegen, könnte es Probleme geben oder?
    @Gast++: Bei deinem Beispiel mit dem vector ist es ja auch so dass die Paletteentries richtig im Speicher liegen müssen.
    Das Problem ist halt, dass ich nicht weiß wie die DirectX-Funktionen mit dem übergebenen Array arbeiten. Und wenn ich dann die Adresse von vector.front() übergebe und die Paletteentries nicht so im Speicher liegen wie das bei einem normalen Array der Fall ist, dürfte das Ganze nicht funktionieren oder?



  • Gast++ schrieb:

    Ein Array ist auch nur ein Zeiger auf einen Speicherbereich.

    😉

    Amateur schrieb:

    Allerdings gibt dies ja nur die Adresse des ersten Elements des Vectors wieder. Wenn die weiteren Elemente des Vectors nicht direkt hinter dem ersten Element im Speicher liegen, könnte es Probleme geben oder?

    stimmt. wenn du ganz sicher gehen willst, dann mach's ohne 'vector'



  • Amateur schrieb:

    @pale dog: Mhhh, ja das habe ich auch schon bei Google gefunden. Allerdings gibt dies ja nur die Adresse des ersten Elements des Vectors wieder. Wenn die weiteren Elemente des Vectors nicht direkt hinter dem ersten Element im Speicher liegen, könnte es Probleme geben oder?

    Nein. Bei einem Vector ist es sichergestellt, daß die Elemente hintereinander im Speicher liegen.

    Kann man hier nachlesen: http://www.sgi.com/tech/stl/Vector.html.



  • pale dog schrieb:

    Gast++ schrieb:

    Ein Array ist auch nur ein Zeiger auf einen Speicherbereich.

    😉

    int foo[42];
    int bar[6][7];
    int* baz = (int*)malloc(42*sizeof(int));
    

    Und wo siehst Du jetzt einen Unterschied zwischen foo, bar und baz?

    Grüsse

    *this



  • Hallo zusammen,

    ich bin der Ansicht, dass man ruhig die Mittel der Standardbibliothek verwenden kann. Vgl.

    #include <vector>
    #include <algorithm>
    using namespace std;
    
    int main() {
            vector<int> v(15);
    
            int *a = new int[v.size()];
            copy(v.begin(), v.end(), a);
    
            delete[] a;
    }
    

    Wenn wirklich die Performance des resultierenden Programms im Mittelpunkt steht, würde man ohne hin keinen Vektor verwenden, sondern ein Array im Stil von C. Was haltet ihr von meiner Meinung? 🙂

    Grüße
    Martin



  • lucky_tux schrieb:

    Hallo zusammen,

    Wenn wirklich die Performance des resultierenden Programms im Mittelpunkt steht, würde man ohne hin keinen Vektor verwenden, sondern ein Array im Stil von C. Was haltet ihr von meiner Meinung? 🙂

    Grüße
    Martin

    Ich habe den Performanceunterschied zwischen dem Vector und einem C-Array vor kurzem mal gemessen. Dabei ist heraus gekommen, daß nur dann ein Unterschied besteht, wenn man mittels Zeigerarithmetik durch das C-Array iteriert. Bei Benutzung der Index-Schreibweise waren beide genau gleich schnell.


  • Mod

    Gast++ schrieb:

    pale dog schrieb:

    Gast++ schrieb:

    Ein Array ist auch nur ein Zeiger auf einen Speicherbereich.

    😉

    int foo[42];
    int bar[6][7];
    int* baz = (int*)malloc(42*sizeof(int));
    

    Und wo siehst Du jetzt einen Unterschied zwischen foo, bar und baz?

    Grüsse

    *this

    uh...
    foo[1] ist ein int
    bar[1] ist ein int[7]
    und sizeof(baz) != sizeof(bar)
    free(foo) ist eher ungesund, free(baz) dagegen notwendig...
    willst du noch mehr haben?



  • Gast++ schrieb:

    Und wo siehst Du jetzt einen Unterschied zwischen foo, bar und baz?

    int foo[42];
    int bar[6][7];
    int* baz = (int*)malloc(42*sizeof(int));
    

    wieso sollte da kein unterschied sein? 😕



  • camper schrieb:

    Gast++ schrieb:

    pale dog schrieb:

    Gast++ schrieb:

    Ein Array ist auch nur ein Zeiger auf einen Speicherbereich.

    😉

    int foo[42];
    int bar[6][7];
    int* baz = (int*)malloc(42*sizeof(int));
    

    Und wo siehst Du jetzt einen Unterschied zwischen foo, bar und baz?

    Grüsse

    *this

    uh...
    foo[1] ist ein int
    bar[1] ist ein int[7]
    und sizeof(baz) != sizeof(bar)
    free(foo) ist eher ungesund, free(baz) dagegen notwendig...
    willst du noch mehr haben?

    Nein, denn sind sind alles nur Zeiger auf Speicherbereiche;
    ich hatte nicht auch nach bar[1] gefragt, sondern nach bar;

    Ob nun von Stack oder Heap ist eine ganz andere Frage.

    Grüsse

    *ths



  • Gast++ schrieb:

    Nein, denn sind sind alles nur Zeiger auf Speicherbereiche;

    arrays sind keine zeiger. du kannst z.b. ein array nicht umbiegen (wie einen zeiger).
    🙂


  • Mod

    Gast++ schrieb:

    Nein, denn sind sind alles nur Zeiger auf Speicherbereiche;

    Dass etwas auf einen Speicherbereich verweist, macht es nicht zu einem Zeiger. Alle Lvalues (und manche Rvalues) tun das.

    Gast++ schrieb:

    ich hatte nicht auch nach bar[1] gefragt, sondern nach bar;

    Du hast überhaupt nur rhetorisch formuliert. Da ist ganz offensichtlich überhaupt keine Frage dahinter sondern der Wille, deine Ansicht unbeirrt zu vertreten.



  • camper schrieb:

    Gast++ schrieb:

    Nein, denn sind sind alles nur Zeiger auf Speicherbereiche;

    Dass etwas auf einen Speicherbereich verweist, macht es nicht zu einem Zeiger.

    Camper, so sehr ich Deine technische Kompetenz schätze um so mehr langweilen mich Deine rhetorischen Gehversuche.

    camper schrieb:

    Gast++ schrieb:

    ich hatte nicht auch nach bar[1] gefragt, sondern nach bar;

    Du hast überhaupt nur rhetorisch formuliert. Da ist ganz offensichtlich überhaupt keine Frage dahinter sondern der Wille, deine Ansicht unbeirrt zu vertreten.

    Geht's noch?

    Grüsse

    *this



  • Immer ruhig mit den Pferden, Jungs.

    Worauf Gast++ vermutlich hinaus will, ist, dass Arrays "fast immer" zu Pointern "degenerieren" - und das ist ja schonmal nicht so falsch. Und spätestens wenn man ein Array dynamisch anlegen möchte, bekommt man sowieso nur einen POinter darauf in die Hand....
    Allerdings ist die Aussage "Arrays = Pointer" eben doch bei etwas genauerer Betrachtung nicht richtig - trotzdem IMO für beide Seiten kein Grund, hier die großen Rhetorikpeitschen auszupacken.

    Gruß,

    Simon2.


Anmelden zum Antworten