boost :: make_shared <t []>值是否初始化或默认初始化数组?</t []>

时间:2014-04-25 15:37:09

标签: c++ boost smart-pointers

我需要不断地将unsigned char的共享数组作为原始缓冲区来保存来自TCP流的数据,然后将其传递给其他几个线程进行处理。我的问题是,boost::make_shared<T[]>(std::size_t)值初始化或默认初始化底层数组吗?由于频率很高(每秒约十次),前者的开销太大。我尝试查看源代码,但是有太多的帮助程序类可以清楚地了解它的作用。

2 个答案:

答案 0 :(得分:3)

来自Boost: make_shared and allocate_shared for arrays

template<typename U> // U = T[]
shared_ptr<U> make_shared_noinit(size_t size);

template<typename U, typename A> // U = T[]
shared_ptr<U> allocate_shared_noinit(const A& allocator, size_t size);
     

描述:这些重载不执行元素的任何值初始化。

template<typename U> // U = T[N]
shared_ptr<U> make_shared_noinit();

template<typename U, typename A> // U = T[N]
shared_ptr<U> allocate_shared_noinit(const A& allocator);
     

描述:上述实用程序的这些重载是针对固定大小的数组。

答案 1 :(得分:2)

来自docs

  

效果:分配适合T类型和大小的数组的内存,并通过放置新表达式 new(pointer) T() new(pointer) T(args...)在其中构建对象数组。 allocate_shared使用allocator的副本来分配内存。如果抛出异常,则无效。

这是执行数组的值初始化,因为它一次初始化每个元素。

Boost还为数组提供了make_shared_noinit版本的make_shared函数,它不执行数组的初始化。这可能更适合您的需求。