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

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

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

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

Предполагать make_shared был использован.

2

Решение

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

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

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

0

Другие решения


По вопросам рекламы [email protected]