Layout of std::vector (libstdc++)

Source code

#include <vector>

int main()
{
  std::vector<int> vec = { 1, 2, 3, 4, 5 };
  return 0;
}

Analysis

$ g++ --version
g++ (Ubuntu 13.2.0-4ubuntu3) 13.2.0
$ g++ main.cpp -g
$ gdb a.out
(gdb) b 6
(gdb) r
(gdb) disable pretty-printer
163 printers disabled
0 of 163 printers enabled
(gdb) p vec
$1 = {...
    {_M_impl = {...
        _M_start = 0x55555556b2b0,
        _M_finish = 0x55555556b2c4,
        _M_end_of_storage = 0x55555556b2c4}}, ...}
(gdb) p vec->_M_impl._M_finish - vec->_M_impl._M_start
$2 = 5
(gdb) p sizeof(vec)
$3 = 24
(gdb) x/3xg &vec
0x7fffffffde10:	0x000055555556b2b0 0x000055555556b2c4
0x7fffffffde20:	0x000055555556b2c4
(gdb) x/5xw vec->_M_impl._M_start
0x55555556b2b0:	0x00000001 0x00000002 0x00000003 0x00000004
0x55555556b2c0:	0x00000005

Layout

|--------------------------------|
|           vector vec           |           | 1 | 2 | 3 | 4 | 5 |
|--------------------------------|           ↑                   ↑
| Ptr in front of the first item |-----------|                   |
|                                |                               |
| Ptr behind the last item       |-------------------------------|
|                                |                               |
| Ptr behind the reserved memory |-------------------------------|
|--------------------------------|
                       Stack (Frame 0)
                    ------------------
    0x7fffffffde20: 0x000055555556b2c4 (Ptr behind the reserved memory)
    0x7fffffffde18: 0x000055555556b2c4 (Ptr behind the last item)
vec 0x7fffffffde10: 0x000055555556b2b0 (Ptr in front of the first item)
                    ------------------
                             ↓

                             ↑
                           Heap
                        ----------
    0x000055555556b2c0: 0x00000005 (item[4])
    0x000055555556b2bc: 0x00000004 (item[3])
    0x000055555556b2b8: 0x00000003 (item[2])
    0x000055555556b2b4: 0x00000002 (item[1])
    0x000055555556b2b0: 0x00000001 (item[0])
                        ----------