boost::make_shared<T[]> 值初始化还是默认初始化数组?
Does boost::make_shared<T[]> value initialize or default initialize the array?
我需要不断地分配一个unsigned char
的共享数组作为原始缓冲区,以保存TCP流中的数据,然后将其传递给其他几个线程进行处理。我的问题是,boost::make_shared<T[]>(std::size_t)
值初始化还是默认初始化底层数组?前者由于频率高(大约每秒十次),开销太大。我试着查看源代码,但有太多的辅助类,无法清楚地了解它在后台的作用。
来自Boost:make_shared
和allocate_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
版本,该函数不执行数组的初始化。这可能更适合你的需求。
相关文章:
- 初始化具有非默认构造函数的std::数组项的更好方法
- 有没有一种代码密度较低的方法来使用非默认构造函数初始化数组?
- 副本初始化的默认模板参数推导
- 使用 std::分配器在 constexpr 中进行默认初始化
- 在C++中使用默认构造函数初始化对象的不同方法
- 强制使用默认构造函数对成员进行未初始化的声明
- 使用默认构造函数初始化对象的不同方法
- 在没有默认构造函数时使用垃圾数据初始化对象
- 为什么对象默认初始化,但基元不在C++?
- 默认参数和空列表初始化
- 为什么std::atomic的默认构造函数不默认初始化底层存储值
- C++中未初始化成员布尔变量的默认值是多少?
- 两个成员,在Base中默认初始化,可能在Derived中非默认初始化
- 默认初始化无法正常工作
- 如何用默认值0或-1初始化unordered_set
- C++11 默认类成员初始化与初始值设定项列表同时
- 使用聚合初始化模拟默认函数参数是否存在任何陷阱?
- 初始化在类类型 #define 中定义的非静态成员数组,不带默认 ctor
- 在皮条类中初始化默认值的最佳位置
- 值初始化:默认初始化或零初始化