Да кажем, че имам обект, управляван от споделен указател: 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