std::vector<char> für C-API



  • Morgen.

    Angenommen ich habe folgende C-API:

    void test(const char* p, size_t size)
    {
    	// fülle das char-array
    }
    

    Der Aufruf sieht momentan so aus:

    std::vector<char> v;
    v.reserve(20);
    test(&v[0], v.capacity());
    

    Jetzt habe ich zwei Fragen dazu:

    1. Ist es richtig das ich reserve() und capacity() nutze, oder wäre resize() und size() richtig?

    2. Entspricht std::vector<char> v(20) einem reserve von 20 oder einem resize von 20?



  • Britt schrieb:

    Angenommen ich habe folgende C-API:

    void test(const char* p, size_t size)
    {
    	// fülle das char-array
    }
    

    Der Aufruf sieht momentan so aus:

    std::vector<char> v;
    v.reserve(20);
    test(&v[0], v.capacity());
    

    Jetzt habe ich zwei Fragen dazu:

    1. Ist es richtig das ich reserve() und capacity() nutze, oder wäre resize() und size() richtig?

    resize() und size() wäre korrekt. Der Zugriff auf ein Vektorelement >= size() erzeugt undefiniertes Verhalten (wird in diesem Fall wohl trotzdem auf allen Systemen funktionieren, da char keinen Ctor hat).

    2. Entspricht std::vector<char> v(20) einem reserve von 20 oder einem resize von 20?

    Letzterem.



  • Ist laut Standard überhaupt garantiert, dass der Speicher hintereinander stehen muss? Reicht es nicht wenn der Iterator mit ++ bzw. -- auf das nächste bzw. vorherige Feld kommt - egal wo es im Speicher liegt?

    MfG SideWinder



  • SideWinder schrieb:

    Ist laut Standard überhaupt garantiert, dass der Speicher hintereinander stehen muss?

    In C++98 nicht, was sich aber als Fehler herausgestellt hat. In der 2003er Überarbeitung ist diese Garantie enthalten. Es wurde folgender Satz eingefügt:

    "The elements of a vector are stored contiguously, meaning that if v is a vector<T, Allocator> where T is some type other than bool, then it obeys the identity &v[n] == &v[0] + n for all 0 <= n < v.size()."



  • @Britt
    nur um es nochmal klar zu stellen, ein vector reserviert intern immer ein bisschen mehr Speicher, damit nicht bei jedem push_back oä. eine komplette Umkopierung und neu Allokierung des Speichers erfolgt, wie viele Objekte ohne diese Umkopierung und neu Allokierung noch gespeichert werden können erfährst du mit capacity und mit reserve kannst du dem Vector einen Hinweis geben, wie viele Objekte du einfügen willst.

    Aber dabei handelt es sich dann um einfach allozierten Speicher, also Objekte etc. wurden noch nicht konstruiert, wenn du nun in dem Vector eine bestimmte Anzahl an Objekten anlegen willst, musst du resize nehmen.



  • kingruedi schrieb:

    ... wurden noch nicht konstruiert, wenn du nun in dem Vector eine bestimmte Anzahl an Objekten anlegen willst, musst du resize nehmen.

    oder gleich den ctor

    std::vector<char> v(20);
    test(&v[0], v.size());
    

Anmelden zum Antworten