我已经使用以下代码测试了stl向量:
struct structA{
char charArray[256];
}
structA a;
..assign 256 characters to a.charArray
vector<structA> v1;
v1.reserve(1000);
for(int i=0; i<1000; i++){
v1.push_back(a);
}
我意识到每推出16次push_back,v1.push_back就会出现峰值。我怀疑存在重新分配的内存。我想知道为什么会这样,因为我已经使用了预备队?我试图使用vectorv1(1000)声明向量,它也给出了相同的行为。
顺便说一句,如果我将char增加到512,只需要8次push_back,8 * 512就会产生大约4k的内存。这个问题会与内存分页有关吗?
感谢。
答案 0 :(得分:2)
运行这个简单的测试,看看是否有任何你不想要或不想要的分配或解除分配。
#include <iostream>
#include <vector>
#include <string>
#include <stdio.h>
#include <algorithm>
template <class T> class my_allocator;
// specialize for void:
template <> class my_allocator<void> {
public:
typedef void* pointer;
typedef const void* const_pointer;
// reference to void members are impossible.
typedef void value_type;
template <class U> struct rebind { typedef my_allocator<U> other; };
};
template <typename T> class my_allocator : public std::allocator<T> {
public:
typedef size_t size_type;
typedef ptrdiff_t difference_type;
typedef T* pointer;
typedef const T* const_pointer;
typedef T& reference;
typedef const T& const_reference;
typedef T value_type;
template <class U>
struct rebind {
typedef my_allocator<U> other;
};
my_allocator() throw()
{
}
my_allocator(const my_allocator& to_copy) throw()
{
}
template <class U>
my_allocator(const my_allocator<U>& to_copy) throw()
{
}
~my_allocator() throw()
{
}
pointer address(reference x) const
{
return std::allocator<T>::address(x);
}
const_pointer address(const_reference x) const
{
return std::allocator<T>::address(x);
}
pointer allocate(size_type s1, typename std::allocator<void>::const_pointer hint = 0)
{
size_t block_size = s1 * sizeof (T);
std::cout << "allocated, bytes: " << block_size << "\n";
return std::allocator<T>::allocate(s1, hint);
}
void deallocate(pointer p, size_type n)
{
size_t block_size = n * sizeof (T);
std::cout << "deallocated, bytes: " << block_size << "\n";
std::allocator<T>::deallocate(p, n);
}
size_type max_size() const throw()
{
return std::allocator<T>::max_size();
}
void construct(pointer p, const T& val)
{
std::allocator<T>::construct(p, val);
}
void destroy(pointer p)
{
std::allocator<T>::destroy (p);
}
};
struct structA{
char charArray[256];
};
int main()
{
structA a;
std::cout << "Test 1, with reserve\n";
{
std::vector<structA, my_allocator<structA> > v1;
v1.reserve(1000);
for(int i=0; i<1000; i++){
v1.push_back(a);
}
}
std::cout << "Test 1, done\n";
std::cout << "Test 2, without reserve\n";
{
std::vector<structA, my_allocator<structA> > v1;
for(int i=0; i<1000; i++){
v1.push_back(a);
}
}
std::cout << "Test 2, done\n";
return 0;
}
答案 1 :(得分:1)
你最好的选择是启动调试器并“进入”保留并看看那里发生了什么 - 也许你的STL实现对reserve()
没有任何作用。步入push_back()
也不会有任何伤害 - 通过这种方式,您将确切知道将要发生的事情。