все замеры относительные, т.е. на любом ПК относительные замеры будут идентичны. исходный код в статье не зря предоставлен, любой пытливый читатель может взять и поделать с ним все что угодно, например, поганять бустовые реализации умных указателей или контейнеров.
контейнер сохранит в себя указатель, если его попросят так vector< obj * >, а если его просят vector, то он СКОПИРУЕТ память занимаемую объектом, т.е. то что приходит например методом push_back. и писать куски памяти в рассматриваемом случае вектор будет последовательно (т.к. контейнер однопроходный).
test_type_and_smart_pointer< _Ptr, T > x2( x );
Container cnt;
cnt.push_back( x );
здесь test_type_and_smart_pointer это объект, внутри которого указатель на динамически распределенную память под испытуемый тип. в вектор ложатся разные куски памяти.
в контейнер помешаются сами объекты, а не указатели (см. код test_simple_ptr). в объектах динамически была выделена память на тестовый тип, которой владеет испытуемый указатель.
указатель на some_obj по производительности идет рядом с указателем на std::string, т.к. основной нагрузочный вес составляет some_obj.s (справедливо при бОльшем заполнении контейнеров объектами содержащими указатель на тестовый тип данных)
т.е.
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++, эмоции потом.
Container cnt;
cnt.push_back( x );
здесь test_type_and_smart_pointer это объект, внутри которого указатель на динамически распределенную память под испытуемый тип. в вектор ложатся разные куски памяти.