I have do an extensive calculation on a big vector of integers. The vector size is not changed during the calculation. The size of the vector is frequently accessed by the code. What is faster in general:
- using the
vector::size()function or - using a helper constant
vectorSizefor storing the size of the vector?
I know that compilers usually inline the size() function when setting the proper compiler flags, however, this is not guaranteed.
Interesting question.
So, what’s going to happened ? Well if you debug with gdb you’ll see something like 3 member variables (names are not accurate):
_M_begin: pointer to the first element of the dynamic array_M_end: pointer one past the last element of the dynamic array_M_capacity: pointer one past the last element that could be stored in the dynamic arrayThe implementation of
vector<T,Alloc>::size()is thus usually reduced to:Now, there are 2 things to consider when regarding the actual optimizations possible:
In other words:
sizeyourself, there is a good chance it will be as fast as the compiler could get it.vector; if not, it cannot cache the variable, and will need to perform memory reads (L1) every time.It’s a micro-optimization. In general, it will be unnoticeable, either because the performance does not matter or because the compiler will perform it regardless. In a critical loop where the compiler does not apply the optimization, it can be a significant improvement.