gdb.txt 3.3 KB

12345678910111213141516171819
  1. В main запустил цикл заполнения (std::push_back() ) std::vector <int>. Памяти, выделенной на вектор
  2. (конкретно на вектор) независимо от размера ровно 24 байта (что наталкивает на размышления).
  3. Более того, при добавлении очередного элемента в вектор, происходит увеличение только 9-ого байта.
  4. С изменением capacity изменяется изменяются 16-ый и 17-ый байты, а адрес нулевого элемента совпадает
  5. с первыми 8 байтами в обратном порядке (little-endian). Выяснилось, что вектор на самом деле хранит
  6. всего 3 указателя (собственно, каждый из которых занимает ровно 8 байт). Вопрос заключается в том,
  7. зачем нужно 3 указателя. Как мы уже выяснили, указатель на первый элемент совпадает с первым из
  8. наших указателей. Логично было проверить, совпадает ли адрес последнего элемента с одним из оставшихся.
  9. (Ну то есть мы знаем, что если это было бы так, то их разница была бы равна 4 * vector_size,
  10. т.к. вектор хранит данные типа int). Как оказалось, второй указатель и говорит нам, где заканчивается вектор.
  11. А вот третий указатель находится дальше - причём всегда так, что между первым и вторым указателем всегда меньше байт,
  12. чем между вторым и третьим. Вспомнив о том, как устроено добавление в вектор, а именно случай, когда выделенная
  13. аллокатором память заканчивается, можно предположить, что в момент, когда вектором выделяется память для последующих
  14. элементов в размере 4 * C * current_vector_size байтов, где C - "магическая" константа (чтобы добавление в вектор
  15. работало амортизационно за О(1)), и передвигается 3ий указатель. Иными словами, получается, что 3ий указатель - это
  16. указатель на конец памяти, которая выделена вектору после расширения.
  17. Ну и собственно касательно цели задания. Capacity не хранится в векторе (как переменная сама по себе) - просто есть
  18. указателя. На основании расположения первых двух из них вычисляется capacity, а 3ий, как мы уже выяснили, показывает
  19. конец аллоцированной памяти.