初めまして。コンテナクラスのメモリの仕様についての質問です。
arrayやvector等のコンテナクラスで使用するメモリは、ヒープ領域に確保されるのでしょうか?
よろしくお願いします。
コンテナクラスのメモリはスタックorヒープ?
Re: コンテナクラスのメモリはスタックorヒープ?
vector はテンプレートの第2引数のデフォルトが allocatorクラスなので、
おそらく new と delete でヒープに領域を確保しているでしょう。
でも、allocator を自分で実装すれば、スタックにすることもできるでしょう。
おそらく new と delete でヒープに領域を確保しているでしょう。
でも、allocator を自分で実装すれば、スタックにすることもできるでしょう。
#include <iostream>
#include <vector>
using namespace std;
int *ptr;
struct FakeAllocator {
typedef int value_type;
template <class U> struct rebind { typedef FakeAllocator other; };
int* allocate(size_t n) { return ptr; }
void deallocate(int* p, size_t n) { }
};
int main()
{
int buf[1024];
ptr = buf;
vector<int, FakeAllocator> a(5);
cout << " buf = " << buf << endl;
cout << "&a[0] = " << &a[0] << endl;
for (int i = 0; i < 5; i++) a[i] = i + 1;
for (int i = 0; i < 5; i++) cout << ' ' << a[i];
cout << endl;
}
Re: コンテナクラスのメモリはスタックorヒープ?
FakeAllocator がフェイク過ぎて、毎回同じアドレスを
返すなんて使い物にならないだろうと気になっていたので、
もうちょっとましな実装に変えてみました。
g++ による実行結果
用意された領域を使い切ったかどうかのチェックをしていないので
まだ不完全ですが、とにかく、デフォルトの allocator より
高速な処理になることは確かです。
返すなんて使い物にならないだろうと気になっていたので、
もうちょっとましな実装に変えてみました。
#include <iostream>
#include <vector>
using namespace std;
struct FakeAllocator {
typedef int value_type;
template <class U> struct rebind { typedef FakeAllocator other; };
int* allocate(size_t n) {
ptr += n;
cout << "allocate: ptr = " << ptr << endl;
return ptr - n;
}
void deallocate(int* p, size_t n) {
if (p + n == ptr) ptr -= n;
cout << "deallocate: ptr = " << ptr << endl;
}
static void set(int *p) {
ptr = p;
cout << "set: ptr = " << ptr << endl;
}
static int* ptr;
};
int* FakeAllocator::ptr;
int main()
{
int buf[1024];
FakeAllocator::set(buf);
vector<int, FakeAllocator> a(3);
vector<int, FakeAllocator> b(5);
vector<int, FakeAllocator> c(4);
cout << " buf = " << buf << endl;
cout << "&a[0] = " << &a[0] << endl;
cout << "&b[0] = " << &b[0] << endl;
cout << "&c[0] = " << &c[0] << endl;
}
set: ptr = 0xffffbbc0
allocate: ptr = 0xffffbbcc
allocate: ptr = 0xffffbbe0
allocate: ptr = 0xffffbbf0
buf = 0xffffbbc0
&a[0] = 0xffffbbc0
&b[0] = 0xffffbbcc
&c[0] = 0xffffbbe0
deallocate: ptr = 0xffffbbe0
deallocate: ptr = 0xffffbbcc
deallocate: ptr = 0xffffbbc0
まだ不完全ですが、とにかく、デフォルトの allocator より
高速な処理になることは確かです。