いつもお世話になっております、山崎と申します。
今回は、placement new についていくつかお伺いに参りました。
OSはXP、エディタはVisual Studio2010を使っております。
前々から興味があったplacement newについて、現在いろいろ調べております。
普通のnewよりどれくらい高速に動作するのかを調べようとプログラムを作っていたのですが、
その前にいろいろわからないことが出てきましたので、皆様のお力をお借りしたいと思います。
なお、placement new については主に以下のサイトを参考に学習しております。
http://www.geocities.jp/ky_webid/cpp/language/036.html
1.
メモリプールとして前もって確保しておくメモリ領域の型は、何でもいいのでしょうか?
char型として確保した領域にint型の値を割り当てたり、
あるいは自作したクラスの型でメモリを確保し、その領域にさらに違うクラスの値を割り当てるなど…。
そういうことは可能なのでしょうか。または、そういった使い方は安全なのでしょうか。
2.
メモリプールの、既に値を割り当てて使用中の領域に対して、誤ってさらに値を割り当てようとした時、
それは実行時エラーにならないのでしょうか?
仮にそれがエラーにならないとしたら、
「メモリプールのどこが使用中で、どこが空いているか」という情報の管理は、
プログラマがしなければいけないのでしょうか。
3.
メモリプールの中のどの位置に値を割り当てるかは選ぶことができるのでしょうか?
4.
デストラクタを明示的に呼び出した後の領域は、不定な値にならないのでしょうか?
仮に、デストラクタで後処理した後の領域に誤ってアクセスしてしまった場合、
デストラクタが呼び出された後の未使用領域ということに気づかずそのままプログラムが走り続けてしまうのでしょうか。
5.
普通のnewに比べて、placement newはどれくらい高速なのでしょうか。
自動変数を利用するくらいに高速なのでしょうか。
似たような意味の質問もあるとは思いますが、どうかお教えいただければ幸いです。
参考に、placement newをとりあえず試しに使ってみた時のコードを貼り付けておきます。
#include <stdio.h>
#include <stdlib.h>
#include <new>
class TestClass
{
public:
int TestInt;
double TestDouble;
TestClass() {printf("called constructor\n");}
~TestClass() {printf("called destructor\n");}
void PrintMember() {printf("Int=%d Double=%lf \n",TestInt,TestDouble);}
void SetMember() //テキトーな値を入れてみる
{
TestInt=rand();
TestDouble=(double)rand()/10;
}
};
int main()
{
char* Pool=new char[sizeof(TestClass)*5]; //char型でメモリプールを作る
TestClass* TestSpace[5];
for(int i=0;i<5;i++)
{
TestSpace=new(Pool) TestClass();
TestSpace->SetMember();
}
TestSpace[0]->~TestClass();
return 0;
}