Скажем, у меня есть объект, управляемый общим указателем: shared_ptr<X>
. Допустим, мой класс X
имеет размер 98 байт, а последний член данных находится в байтах 97-98 (символ).
Вообще говоря, общий ptr содержит необработанный указатель на мой объект X
и необработанный указатель на объект подсчета ссылок, который содержит два счетчика (один сильный счетчик ссылок и один счетчик слабых ссылок).
С какого адреса должен начинаться объект подсчета ссылок (т. е. расположение двух счетчиков ссылок)? Будет ли это сразу после конца моего класса X
, 98-го байта? Или будет определенное числовое выравнивание, скажем, 32-байтовое выравнивание, и оно будет на 128-м байте? Что вообще определяет местоположение?
Предположим, что make_shared
был использован.
_Sp_counted_base
с двумя_Atomic_word
для счетчиков ссылок в качестве базового класса для_Sp_counted_ptr_inplace
, который имеет элемент данных вложенного класса_Impl
, который использует__gnu_cxx::__aligned_buffer<_Tp>
. Таким образом, структура памяти, вероятно, выглядит так: vptr, сильный счетчик, слабый счетчик, выровненный буфер (при пустых распределителях и дефолтном удалении). - person dyp   schedule 06.06.2014