プレースメント new の使用を少し簡単にするために、いくつかのマクロを作成しました。これらが機能しない明らかなケースがあるかどうか疑問に思っていました. ありがとう。
#define CONSTRUCT_INPLACE(TYPE,STORAGE,INIT) ::new((TYPE*)STORAGE) TYPE INIT
#define DESTRUCT_INPLACE(TYPE,STORAGE) ((TYPE*)STORAGE)->~TYPE()
プレースメント new の使用を少し簡単にするために、いくつかのマクロを作成しました。これらが機能しない明らかなケースがあるかどうか疑問に思っていました. ありがとう。
#define CONSTRUCT_INPLACE(TYPE,STORAGE,INIT) ::new((TYPE*)STORAGE) TYPE INIT
#define DESTRUCT_INPLACE(TYPE,STORAGE) ((TYPE*)STORAGE)->~TYPE()
他の場所で述べた問題に加えて、あなたのマクロはテンプレート型と非常にうまく相互作用しません (つまり、コンパイルに失敗します)。
一般に、明確なメリットがない場合は、マクロを避ける必要があります。率直に言って、ここには本当のメリットが見られません。
例えば
template< class A, class B >
class T
{
public:
T(A y, B z) : x(y), w(z) {}
A x;
B w;
};
int main()
{
void* p = ::operator new(sizeof(T));
CONSTRUCT_INPLACE(T<int, double>, p, (4, 5.0));
DESTRUCT_INPLACE(T<int, double>, p);
::operator delete(p);
return 0;
}
(TYPE*)
それらを見て、最初のキャストは何のためにあるのだろうと思います- 配置 new は ,void*
結局のところ
しかし、繰り返しになりますが、それらは何に役立つのでしょうか。彼らが管理しているのは、最初は本当に些細なことではない何かをさらに難読化することだけです. なぜそれらが必要だと思いますか?
そうは言っても、初期化されていないメモリを処理するための (確かに少数の) 標準ライブラリ機能を見たことがありますか? (このサイトの下半分を見てください。使えるものがあるかもしれません。
Placement-new 演算子は、最初は「生の」メモリのブロックであるオブジェクトを作成します。つまり、配置 new に渡されるメモリ ポインタの適切な型は 'void*' です。'(TYPE*)' 型にキャストしても害はありませんが、役に立ちません。「DESTRUCT」マクロのキャストのポイントもすぐにはわかりません。
ところで、これらのマクロを持つことのポイントは何ですか? あなたは「placement new の使用を少し簡単にする」と言っていますが、まったく不要なキャストを実行しているように見えます。