Hacker News new | ask | show | jobs
by kllrnohj 2712 days ago
But you can easily avoid that cost on std::vector, too. std::vector doesn't default-initialize unless you ask it to via resize(). reserve() doesn't initialize, though, it just allocates. Take this toy example:

    #include <vector>
    #include <cstdio>

    struct MyFoo {
        MyFoo() { printf("default ctor\n"); }
        MyFoo(int i) { printf("Initialized with %d\n", i); }
        MyFoo(const MyFoo& foo) {}
    };

    int main() {
        std::vector<MyFoo> myvec;
        myvec.reserve(100);
        printf("resize(2)\n");
        myvec.resize(2);
        printf("emplace_back()\n");
        myvec.emplace_back();
        printf("emplace_back(1)\n");
        myvec.emplace_back(1);
        printf("push_back(MyFoo{1})\n");
        myvec.push_back(MyFoo{2});
        return 0;
    }
It will print:

    resize(2)
    default ctor
    default ctor
    emplace_back()
    default ctor
    emplace_back(1)
    Initialized with 1
    push_back(MyFoo{1})
    Initialized with 2
Only the resize() call did a default initialization "silently", nothing else did.
1 comments

The tradeoff is that emplace_back and push_back need to check the capacity (even though they won't reallocate because of reserve). Whereas with resize, assignments into the initialized area need no checks at all.