boost::make_shared<T[]>对数组进行值初始化还是默认初始化?

3
我需要不断地分配一个共享的unsigned char数组作为原始缓冲区,以容纳来自TCP流的数据,然后将其传递给其他几个线程进行处理。我的问题是,boost::make_shared<T[]>(std::size_t)会对底层数组进行值初始化或默认初始化吗?前者有太多的开销,因为频率很高(每秒约十次)。我尝试查看源代码,但有太多的辅助类,无法清楚地了解它在底层做了什么。
2个回答

3

来自Boost库:make_sharedallocate_shared用于数组

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);

Description: These overloads do not perform any value initialization of elements.

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);

Description: These overloads of the utilities above are for a fixed size array.


2
文档中可以看到:
效果:分配适用于类型T和大小为size的数组的内存,并通过放置new表达式new(pointer) T()new(pointer) T(args...)在其中构造对象数组。allocate_shared使用allocator的副本来分配内存。如果抛出异常,将没有任何影响。
这是对数组执行值初始化,因为它逐个对每个元素进行值初始化。
Boost还提供了make_shared_noinit版本的make_shared函数,用于数组,它不会对数组进行任何初始化。那可能更适合您的需求。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接