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