Question: I notice that vector is much slower than bool array when running the following code. 

```
int main() 
{
    int count = 0;
    int n = 1500000;
    // slower with c++ vector<bool>
    /*vector<bool> isPrime;
    isPrime.reserve(n);
    isPrime.assign(n, true);
    */
    // faster with bool array 
    bool* isPrime = new bool[n];

    for (int i = 0; i < n; ++i)
        isPrime[i] = true;

    for (int i = 2; i< n; ++i) {
        if (isPrime[i])
            count++;
        for (int j =2; i*j < n; ++j )
            isPrime[i*j] = false;
    }

    cout <<  count << endl;
    return 0;
}

```

Is there some way that I can do to make `vector<bool>` faster ? Btw, both `std::vector::push_back` and `std::vector::emplace_back` are even slower than `std::vector::assign`.

Answer: 
`std::vector<bool>` can have various performance issues (e.g. take a look at <https://isocpp.org/blog/2012/11/on-vectorbool>).

In general you can:

* use `std::vector<std::uint8_t>` instead of `std::vector<bool>` (give a try to [`std::valarray<bool>`](http://en.cppreference.com/w/cpp/numeric/valarray) also).

This requires more memory and is less cache-friendly but there isn't a overhead (in the form of bit manipulation) to access a single value, so there are situations in which it works better (after all it's just like your array of `bool` but without the nuisance of memory management)
* use [`std::bitset`](http://en.cppreference.com/w/cpp/utility/bitset) if you know at compile time how large your boolean array is going to be (or if you can at least establish a reasonable upper bound)
* if Boost is an option try [`boost::dynamic_bitset`](http://www.boost.org/doc/libs/1_60_0/libs/dynamic_bitset/dynamic_bitset.html) (the size can be specified at runtime)

---

But for speed optimizations you have to test...

With your specific example I can confirm a performance difference only when optimizations are turned off (of course this isn't the way to go).

Some tests with g++ v4.8.3 and clang++ v3.4.5 on an Intel Xeon system (`-O3` optimization level) give a different picture:

```
                    time (ms)
                 G++      CLANG++
array of bool    3103     3010
vector<bool>     2835     2420    // not bad!
vector<char>     3136     3031    // same as array of bool
bitset           2742     2388    // marginally better

```

(time elapsed for 100 runs of the code in the answer)

`std::vector<bool>` doesn't look so bad (source code [here](http://rextester.com/SGKEVO84915)).
`vector<bool>` may have a template specialization and may be implemented using bit array to save space. Extracting and saving a bit and converting it from / to `bool` may cause the performance drop you are observing. If you use `std::vector::push_back`, you are resizing the vector which will cause even worse performance. Next performance killer may be `assign` (Worst complexity: Linear of first argument), instead use `operator []` (Complexity: constant).

On the other hand, `bool []` is guaranteed to be array of `bool`.

And you should resize to `n` instead of `n-1` to avoid undefined behaviour.