Boost::Array与Std::Vector使用与性能

本文对比分析了Boost::array、std::vector和普通数组在内存分配、赋值效率上的表现,指出Boost::array在特定场景下相较于普通数组存在较高的开销。通过实验数据展示了在不同数据类型和重复赋值次数下,三种数据结构的运行时间差异,最终揭示了Boost::array的使用场景和限制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

大家都希望可以像操作STL容器一样的去操作数组,C++可没有提供这个东西,有时候你会选择使用vector来替代,不过这毕竟不是个好的办法,毕竟vector模拟动态数组比较稳妥,而用它去替代一个普通的数组,开销毕竟太大了。而恰好,boost::array就为你提供了这个功能。boost::array的定义如下(简化):
template<class T, std::size_t N>   
class array
{    
public:        T elems[N];    // fixed-size array of elements of type T     
public:        // type definitions     
    typedef T              value_type;
    typedef T
*             iterator;
    typedef
const T*       const_iterator; 
    typedef T
&             reference;    
    typedef
const T&       const_reference;
    typedef std::size_t    size_type;     
    typedef std::ptrdiff_t difference_type;   
   
// iterator support      
    iterator begin() { return elems; }      
    const_iterator begin()
const { return elems; }  
    iterator end() {
return elems+N; }      
    const_iterator end()
const { return elems+N; }
   
// operator[]      
    reference operator[](size_type i) ;        
    const_reference
operator[](size_type i) const ;        // at() with range check      
    reference at(size_type i) ;       
    const_reference at(size_type i)
const ;            // front() and back()      
    reference front() ;            
    const_reference front()
const ;             
    reference back() ;              
    const_reference back()
const ;               // size is constant       
    static size_type size() { return N; }   
   
static bool empty() { return false; }    
   
static size_type max_size() { return N; } 
   
enum { static_size = N };        // swap (note: linear complexity)      
    void swap (array<T,N>& y) ;   
}

  显而易见,其实它只是将数组简单的包装,并附加了迭代器而已,你可以把它当成是普通的数组来使用,也可以进行STL的算法操作,是不是很方便?当然它也是有弊端的,当你想要创建一个未知个数的数组时,你就无能为力了:

int[] arr = {1,2,3}; //boost::array<int,N> arr = {1,2,3} //error!

  当然,有这种需要的时候你还是要用普通的数组,不过在其他的时候呢?

  那么,我们来比较一下他们的运行效率。

  我们分别创建boost::array,std::vector,普通数组,并对他们进行赋值。

#define _size 10000 #define _recount 10000 // 计算时间用 DWORD start, finish; double duration;

首先是boost::array

boost::array<int,_size> a_int;
start
= timeGetTime();
int i=0;
for (i=0;i<_recount;i++)
{
   
for (int j=0;j<_size;j++)
    {
        a_int[j]
= j;
    }
}
finish
= timeGetTime();
duration
= (double)(finish - start) / CLOCKS_PER_SEC;

 然后是std::vector

vector<int> v_int;
v_int.resize(_size);
start
= timeGetTime();
for (i=0;i<_recount;i++)
{
   
for (int j=0;j<_size;j++)
    {
        v_int[j]
= j;
    }
}
finish
= timeGetTime();
duration
= (double)(finish - start) / CLOCKS_PER_SEC;

 最后是普通数组 

int _int[_size];
start
= timeGetTime();
for (i=0;i<_recount;i++)
{
   
for (int j=0;j<_size;j++)
    {
        _int[j]
= j;
    }
}
finish
= timeGetTime();duration = (double)(finish - start) / CLOCKS_PER_SEC;

 得出运行时间:

Boost::array : 3.296 std::vector : 10.453 普通数组 : 0.296

Oh my god ! 相差这么多? 恩,的确相差了这么多!因为我们是使用的int类型作为操作数,那么当我们使用自定义的class的时候时间如下:

boost::array : 12.656 std::vector : 18.656 普通数组 : 9.609

这个时候,我们可以看出,普通的数组比boost::array快了1/4,而比std::vector快了1/2。

<think>好的,我现在需要回答用户的问题:“boost::shared_array生成的叫什么”。首先,我应该回忆一下Boost库中的智能指针相关知识。 用户提到了boost::shared_array,这应该是一个智能指针类。根据我的记忆,Boost库提供了几种智能指针,比如shared_ptr、scoped_ptr和shared_array等。shared_ptr用于管理动态分配的对象,而shared_array可能类似,但专门用于数组。 接下来,我需要确认shared_array的具体用途和名称。shared_array应该是一个用于管理动态分配的数组的智能指针。它提供自动的内存管理,通过引用计数来确保数组在不再被使用时被正确释放。这样用户就不需要手动调用delete[],避免内存泄漏。 然后,我需要明确用户的问题:“生成的叫什么”。这里的“叫什么”可能指的是这个智能指针对象的名称,或者是它的类型名称。根据Boost文档,shared_array本身就是一个类模板,用户使用时需要实例化它,例如boost::shared_array<int>,这会生成一个管理int数组的智能指针对象。 可能用户对shared_array的实例化后的对象名称有疑问,但通常这个名称由用户自己定义,比如boost::shared_array<int> arr(new int[10]); 这里arr就是用户定义的变量名。不过,用户可能想了解的是这个智能指针的类型名称,也就是boost::shared_array<T>。 另外,我需要确保回答中提到的信息准确。比如,shared_array确实是用于数组,使用delete[]来释放内存,而shared_ptr则使用delete,所以不能混用。同时,shared_array在C++11之后可能被std::shared_ptr替代,但std::shared_ptr需要自定义删除器来处理数组,而Boost的shared_array自动处理这一点。 可能还需要比较一下shared_array和shared_ptr的区别,强调shared_array针对数组的特性,比如重载的operator[],以及正确的内存释放方式。 最后,我需要用中文组织回答,结构清晰,分点说明,确保用户能够理解shared_array的作用、用法以及注意事项,同时指出其在现代C++中的替代方案。</think>boost::shared_array 生成的智能指针对象类型名称是 `boost::shared_array<T>`(其中 `T` 是数组元素的类型)。以下是详细说明: --- ### 1. **基本定义** - **作用**:`boost::shared_array` 是 Boost 库提供的一种智能指针,专门用于管理动态分配的 **数组**(通过 `new[]` 分配)。 - **核心特性**:通过引用计数实现自动内存管理,当最后一个 `shared_array` 对象销毁时,自动调用 `delete[]` 释放数组。 --- ### 2. **关键行为** - **构造初始化** 需显式绑定动态数组: ```cpp boost::shared_array<int> arr(new int[10]); // 管理一个长度为10的int数组 ``` - **访问元素** 重载了 `operator[]`,可直接访问数组元素: ```cpp arr[0] = 42; // 操作原生数组一致 ``` - **所有权共享** 支持拷贝和赋值,引用计数自动增减: ```cpp boost::shared_array<int> arr2 = arr; // 引用计数+1 ``` --- ### 3. ** `boost::shared_ptr` 的区别** | 特性 | `boost::shared_array` | `boost::shared_ptr` | |---------------------|-------------------------------|--------------------------------| | **管理对象** | 动态分配的数组 (`new[]`) | 动态分配的单对象 (`new`) | | **释放方式** | 自动调用 `delete[]` | 自动调用 `delete` | | **访问元素** | 支持 `operator[]` | 通过 `operator*` 或 `operator->` | | **C++11 替代方案** | 无直接等价,需结合 `std::shared_ptr` 自定义删除器 | `std::shared_ptr` | --- ### 4. **现代 C++ 的替代方案** 在 C++11 及更高版本中,建议优先使用标准库的 `std::shared_ptr`,但需注意: - 对数组需指定自定义删除器: ```cpp std::shared_ptr<int[]> arr(new int[10], [](int* p) { delete[] p; }); // C++17 起支持 `std::shared_ptr<T[]>` ``` - 或使用 `std::vector` 或 `std::array` 替代原始数组。 --- ### 5. **典型应用场景** - 需要共享动态数组所有权时(如跨多线程、多对象共享数据)。 - 需避免手动调用 `delete[]` 的场合。 --- **总结**:`boost::shared_array` 生成的智能指针类型为 `boost::shared_array<T>`,专为动态数组设计,提供自动化的内存管理。尽管在现代 C++ 中可用 `std::shared_ptr` 替代,但其针对数组的特性(如 `operator[]`)仍有一定实用价值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值