我的程序使用569MB内存,只需要500MB, 我有很多不同大小的std :: vector 有没有办法将容量设置为元素数量以避免内存开销。 (我不是关于表现的事情,记忆是关键)
答案 0 :(得分:4)
如何将std :: vector的容量限制为元素数
您可以做的最好的事情是在添加元素之前保留所需的空间。这也应该具有最佳性能,因为它没有重新分配和复制。
如果这不切实际,那么您可以在添加元素后使用std::vector::shrink_to_fit()
。当然,如果分配可能永远不会达到设定限制以上,那对我们没有帮助。
从技术上讲,这些方法都不能通过标准来保证容量与大小相匹配。您依赖于标准库实现的行为。
答案 1 :(得分:2)
您可能正在寻找shrink_to_fit
方法,请参阅http://en.cppreference.com/w/cpp/container/vector/shrink_to_fit。
或者,如果你不能/允许使用C ++ 11,你可能想要使用swap-to-fit习语:https://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Shrink-to-fit
在C ++ 11中(注意编译器可能会忽略shrink_to_fit
):
vector<int> v;
// ...
v.shrink_to_fit();
交换适合的习语:
vector<int> v;
// ...
vector<int>( v ).swap(v);
// v is swapped with its temporary copy, which is capacity optimal
答案 2 :(得分:2)
在向其推送任何内容之前写一些包装器和控件大小,或者使用固定大小的std :: array而不是
答案 3 :(得分:0)
您可以使用自定义分配器并提供模板参数所需的容量。修改此线程中的示例: Compelling examples of custom C++ allocators?
#include <memory>
#include <iostream>
#include <vector>
namespace my_allocator_namespace
{
template <typename T, size_t capacity_limit>
class my_allocator: public std::allocator<T>
{
public:
typedef size_t size_type;
typedef T* pointer;
typedef const T* const_pointer;
template<typename _Tp1 >
struct rebind
{
typedef my_allocator<_Tp1 , capacity_limit> other;
};
pointer allocate(size_type n, const void *hint=0)
{
if( n > capacity_limit ) {
return std::allocator<T>::allocate(capacity_limit );
}
return std::allocator<T>::allocate(n, hint);
}
void deallocate(pointer p, size_type n)
{
return std::allocator<T>::deallocate(p, n);
}
my_allocator() throw(): std::allocator<T>() { }
my_allocator(const my_allocator &a) throw(): std::allocator<T>(a) { }
template <class U,size_t N>
my_allocator(const my_allocator<U,N> &a) throw(): std::allocator<T>(a) { }
~my_allocator() throw() { }
};
}
using namespace std;
using namespace my_allocator_namespace;
int main(){
vector<int, my_allocator<int,20> > int_vec(10);
for(int i = 0 ;i < 20; i++)
{
std::cerr << i << "," << int_vec.size() << std::endl;
int_vec.push_back(i);
}
}
然而,应该谨慎访问超出范围的指数