Скажем, у меня есть объект, управляемый общим указателем: shared_ptr<X>
, Допустим мой X
класс имеет размер 98 байт, а последний элемент данных — байт 97-98 (символ).
Вообще говоря, общий ptr содержит необработанный указатель на мой X
объект и необработанный указатель на объект подсчета ссылок, который содержит два счетчика (один сильный счетчик ссылок и один слабый счетчик ссылок).
По какому адресу будет начинаться объект подсчета ссылок (т. Е. Расположение двух счетчиков ссылок)? Будет ли это сразу после окончания моего X
класс, 98 байт? Или будет какое-то конкретное числовое выравнивание, скажем, выровненное по 32 байта, и оно будет на 128 байте? Что определяет местоположение в целом?
Предполагать make_shared
был использован.
Это, безусловно, деталь реализации.
Однако на самом деле есть только два варианта, подсчет ссылок может идти до или после управляемого T
объект.
В любом случае я бы предположил, что счетчики ссылок будут выровнены по своему естественному выравниванию, так как наличие целого числа, которое не выровнено естественным образом, приведет к сбою на некоторых платформах и будет намного, намного медленнее на других платформах.