我已经用下面的代码对 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) 声明向量,它也给出了相同的行为。
顺便说一句,如果我将字符增加到 512,则只需要 8 个 Push_back,8 * 512 提供大约 4k 内存。该问题与内存分页有关吗?
Thanks.
运行这个简单的测试,看看是否有任何您不想要或不期望的分配或释放。
#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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)