Search code examples
c++arraysc++11constantsc++14

constexpr array vs deque, memory utilization


I need to store a pre-known size of about 30 integers in my code, I have gone for

constexpr std::array<size_t, 30> MAPPING{1, 2, 3, ...};

If i am not wrong, the above will be evaluated at compile time, but it would also take up a single sequential block of memory of a size of 30 integers?

If it does, is it worth using a std::deque instead

const std::deque<int> MAPPING{1, 2, 3, ...};

This way, with a deque, we would not be using a single large sequential memory block and it might use a bunch of fragmented blocks instead and thus it will work fine even if the memory is fragmented?

Please let me know if I have missed anything, thanks


Solution

  • It's not worth using std::deque here.

    It would also take up a single sequential block of memory of a size of 30 integers?


    Yes, it would take up a single sequential block of memory of a size of 30 integers in the stack

    This way, with a deque, we would not be using a single large sequential memory block and it might use a bunch of fragmented blocks instead and thus it will work fine even if the memory is fragmented?


    It's implementation-dependent, for 30 integers they may be split into several small blocks or may not, but it will use heap memory and thus has runtime overhead:

    As opposed to std::vector, the elements of a deque are not stored contiguously: typical implementations use a sequence of individually allocated fixed-size arrays, with additional bookkeeping, which means indexed access to deque must perform two pointers dereferences, compared to vector's indexed access which performs only one.

    According to @Homer512's comment, we also need to notice the memory fragmentation when using the heap, there may be memory waste and we can't avoid it.