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

Does boost::make_shared<T[]> value initialize or default initialize the array?

本文关键字:初始化 默认 gt 数组 make shared lt boost      更新时间:2023-10-16

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

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

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

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

说明:以上实用程序的这些重载适用于固定大小的数组。

来自文档:

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

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

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