3

Преимущество ссылочной ссылки на подсчет ссылок заключается в том, что бывший не использует дополнительный бесплатный магазин, что делает его более надежным: Создание интеллектуального указателя с привязкой к ссылке не может не получиться. Недостатком является то, что для ссылочного связывания требуется больше памяти для его бухгалтерского учета (три указателя против одного указателя плюс одно целое). Кроме того, подсчет ссылок должен быть немного более быстрым - при копировании умных указателей требуется только косвенность и приращение. Список Менеджмент несколько более сложный. В заключение вы должны использовать ссылку , ссылаясь только на то, что свободного магазина недостаточно. В противном случае предпочитают подсчет ссылок.Преимущество ссылочной ссылки на подсчет ссылок при реализации интеллектуального указателя?

Это цитата из Modern C++ Design: Generic Programming and Design Pattern Applied. Я не понимаю, почему ссылки на основе ссылок на смарт-указатель не используют дополнительный бесплатный магазин, а затем становятся более надежными, т. Е. Никогда не терпят неудачу? Может ли кто-нибудь дать немного объяснений по этому поводу? Благодаря!

+1

Не обманывать это, но все равно стоит прочитать: http://stackoverflow.com/questions/14291744/why-doesnt-stdshared-ptr-use-reference-linking – user4581301

+0

В приведенной вами ссылке говорится: « контрольный блок в куче, который содержит контрольный счетчик "также подтверждает ответ @ legendends2k". – Peng

+0

Да, но обратите внимание на предупреждение Джонатана Вакели о том, как трудно защитить ссылку, связанную с умным указателем, в многопоточной среде. * создание * ссылка любимый указатель безопаснее, но * безопасно * безопасно это другое дело. – user4581301

ответ

2

Когда вы объявляете признанный интеллектуальный указатель ссылкой как автоматическую переменную и выделяете хранилище из свободного хранилища для его управления, хотя переменные-члены указателя будут находиться в автоматическом хранилище, блок управления, созданный для ведения бухгалтерского учета и управления объектом будет в свободном магазине. Тривиальный пример:

class RefCountIntPtr { 
    int *pointee; 
    int *count; 

public: 
    RefCountIntPtr(int *x) { 
     if (x) { 
      pointee = x; 
      // allocate an int from free store and assign 1 to it 
      count = new int(1); 
     } 
    } 
}; 

int main() { 
    RefCountIntPtr sp; 
} 

Здесь sp «s pointee и count бы получить выделяется в стеке, а то, что count собирается указать будет выделяться в куче. Предполагая, что реализация (компилятор) использует кучу для свободного хранилища и стека для автоматического хранения.

С другой стороны, ссылки, связанные с интеллектуальными указателями, не имеют распределения управляющего блока из бесплатного хранилища, все они имеют три указателя в качестве переменных-членов, все они выделяются при автоматическом хранении. Создание большего количества из них? Нет проблем, все они будут в автоматическом хранилище, выступая в качестве связанного списка, когда вы укажете на то же самое. Разница заключается в том, что вместо того, чтобы иметь явный счет, связанный список действует как неявный, когда все ссылки обращаются в нуль, мы знаем, что счетчик равен 0, а пункт должен быть освобожден.

Причина в комментарии к надежности заключается в том, что при распределении из бесплатного хранилища существует большая вероятность того, что он будет протекать во время исключительного сценария. Однако автоматическое распределение переменных намного надежнее, поскольку компилятор автоматически обрабатывает освобождение. См. Why should C++ programmers minimize use of 'new'?.

+0

Это ясность, которую я ожидаю ~ Отличный ответ! – Peng

+0

За исключением того, что он говорит «на стеке» и «на куче», которые являются деталями реализации и могут быть неверными. Так что на самом деле не так много ясности. –

+0

Исправлено! Однако комментарий Андрея о надежности показывает, что он берет на себя ответственность за то, что автоматическое хранение почти всегда происходит из реализации стека, нет? – legends2k

Смежные вопросы