Как се изчислява подравняването на обекти и 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. com/2012/04/22/   -  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