Hacker News new | ask | show | jobs
by kbsletten 2705 days ago
I read it as the author almost never uses the uninitialized data and when they do need a zeroed array it's simple to do so why pay the cost to initialize the elements when you're about to set them anyway.
2 comments

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.
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.
There is also the approach to just copy objects existing objects to safe yourself the cost of running the constructor in order to shorten your startup time.