Как рассчитывается выравнивание объектов и shared_ptrs?

Скажем, у меня есть объект, управляемый общим указателем: shared_ptr<X>. Допустим, мой класс X имеет размер 98 байт, а последний член данных находится в байтах 97-98 (символ).

Вообще говоря, общий ptr содержит необработанный указатель на мой объект X и необработанный указатель на объект подсчета ссылок, который содержит два счетчика (один сильный счетчик ссылок и один счетчик слабых ссылок).

С какого адреса должен начинаться объект подсчета ссылок (т. е. расположение двух счетчиков ссылок)? Будет ли это сразу после конца моего класса X, 98-го байта? Или будет определенное числовое выравнивание, скажем, 32-байтовое выравнивание, и оно будет на 128-м байте? Что вообще определяет местоположение?

Предположим, что make_shared был использован.


person user997112    schedule 05.06.2014    source источник
comment
Хм? Общий указатель (и, следовательно, его члены) отличаются от самого объекта. Их места в памяти, как правило, не будут связаны   -  person Oliver Charlesworth    schedule 06.06.2014
comment
@OliCharlesworth не согласно этому: lanzkron.wordpress. ком/22/04/2012/   -  person user997112    schedule 06.06.2014
comment
С другой стороны, при использовании make_shared и отслеживаемый объект, и подсчет ссылок могут распределяться вместе. Взгляните также на вторую схему.   -  person user997112    schedule 06.06.2014
comment
Интересно. Итак, make_shared творит чудеса. Тем не менее, почему важно согласование деталей внутренней реализации?   -  person Oliver Charlesworth    schedule 06.06.2014
comment
Глядя на libstdc++, кажется, что они используют _Sp_counted_base с двумя _Atomic_word для счетчиков ссылок в качестве базового класса для _Sp_counted_ptr_inplace, который имеет элемент данных вложенного класса _Impl, который использует __gnu_cxx::__aligned_buffer<_Tp>. Таким образом, структура памяти, вероятно, выглядит так: vptr, сильный счетчик, слабый счетчик, выровненный буфер (при пустых распределителях и дефолтном удалении).   -  person dyp    schedule 06.06.2014
comment
@dyp Прошу прощения, я просматривал исходный код, но заблудился! Итак, я предполагаю, что мой вопрос заключается в выравнивании распределения памяти для объекта _Sp_counted_base? Будет ли он выделен на границе размера слова (4/8 байта) или что-то еще?   -  person user997112    schedule 06.06.2014


Ответы (1)


Это, безусловно, деталь реализации.

Однако на самом деле есть только два варианта: подсчет ссылок может идти до или после управляемого объекта T.

В любом случае я бы предположил, что счетчики ссылок будут выровнены по их естественному выравниванию, поскольку наличие целого числа, которое не выровнено естественным образом, приведет к сбою на некоторых платформах и будет намного медленнее на других платформах.

person Motti    schedule 08.06.2014