Обновить
4
0

Пользователь

Отправить сообщение
так он и не используется в контейнере напрямую, ввиду семантики копирования и присваивания. см. определение шаблона test_type_and_smart_pointer.
комбинация параметров шаблонов достаточно ясна:

auto f_0n = [&]() -> void
{ test_smart_ptr< auto_ptr< long >, long, vector< test_type_and_smart_pointer< auto_ptr< long >, long > >, false >( false, long_val ); };


т.е.
auto f_0n = [&]() -> void
{ test_smart_ptr< УмныйУказатель< ТипДанных>, ТипДанных, Контейнер< test_type_and_smart_pointer< УмныйУказатель< ТипДанных>, ТипДанных> >, false >( true, ЗначениеТипаДанных); };
auto b_16 = [&]() -> void
{ test_simple_ptr< ТипДанных, Контейнер< test_type_and_simple_pointer< ТипДанных*, ТипДанных> >, false >( true, ЗначениеТипаДанных); };

если коменту ставят плюсы, тогда уведомлю: статья для мыслящих людей, а не ленивых, кому читать текст лень и понимать, что происходит в программе.
даже не знаю, что и сказать… предложу только под отладкой пройти по коду, чтобы понять в чем заключается данный тест.
все замеры относительные, т.е. на любом ПК относительные замеры будут идентичны. исходный код в статье не зря предоставлен, любой пытливый читатель может взять и поделать с ним все что угодно, например, поганять бустовые реализации умных указателей или контейнеров.
имел ввиду что элементы вектора лежат последовательно в смежных областях памяти.
очепятался, говорилось про вектор, что он однонаправленный.
тест комплексный. дело то в том, что у контейнеров разные аллокаторы.
попросят obj без звездочки
контейнер сохранит в себя указатель, если его попросят так vector< obj * >, а если его просят vector, то он СКОПИРУЕТ память занимаемую объектом, т.е. то что приходит например методом push_back. и писать куски памяти в рассматриваемом случае вектор будет последовательно (т.к. контейнер однопроходный).
char * s = new char[ 5 ];
s[0] = 'a'; s[1] = 'b';
std::vector< std::string > v;
v.push_back( s );
delete s;
std::string d = *v.begin();
>> d = 'ab';
учите c++, эмоции потом.
test_type_and_smart_pointer< _Ptr, T > x2( x );
Container cnt;
cnt.push_back( x );
здесь test_type_and_smart_pointer это объект, внутри которого указатель на динамически распределенную память под испытуемый тип. в вектор ложатся разные куски памяти.
s член класса some_obj
в контейнер помешаются сами объекты, а не указатели (см. код test_simple_ptr). в объектах динамически была выделена память на тестовый тип, которой владеет испытуемый указатель.
указатель на some_obj по производительности идет рядом с указателем на std::string, т.к. основной нагрузочный вес составляет some_obj.s (справедливо при бОльшем заполнении контейнеров объектами содержащими указатель на тестовый тип данных)

Информация

В рейтинге
Не участвует
Откуда
Ярославль, Ярославская обл., Россия
Дата рождения
Зарегистрирован
Активность