6

この質問がばかげているように聞こえる場合は申し訳ありませんが、私はC ++を学び始めたばかりであり、新しい配置について私を混乱させる何かがあります

私はC++入門書(C ++を学ぶのに非常に良い本だと思います)を読んでいますが、配置構文の新しいセクションに例があります。この例では、char配列を使用して、新しい配置用のメモリスペースを提供しています。

const int BUF = 512;
const int N = 5;
char buffer[BUF];
double * pd1;
pd1 = new (buffer) double[N];

私の質問は、なぜ新しい配置のためのメモリスペースを提供するためにchar配列を使用しているのですか?また、上記のコードの最後の行は、doubleの配列にメモリを割り当てていますが、元のメモリ空間にchar配列が含まれている場合、どうすればそれが可能になりますか?newの配置がchar配列のメモリ空間を使用している場合、これは、double配列を割り当てるときに、そのメモリ内のchar配列を上書きすることを意味しますか?

質問がおかしい場合はもう一度申し訳ありませんが、私がそれをかなり明確にしたことを願っています。

4

5 に答える 5

7

新しい配置用のメモリ空間を提供するために char 配列を使用しているのはなぜですか?

なぜだめですか?charC++ が定義する最小の型であり、事実上すべての実装で、サイズは 1 バイトです。したがって、特定のサイズのメモリ ブロックを割り当てる必要がある場合に使用するのに適した型になります。

C++ には、char(およびのみ charの配列の割り当て方法に関する非常に特殊なメカニズムもあります。new char[*]たとえば、 A は、 のアラインメントにアラインされませんchar。任意の型の最大通常アラインメントにアラインされます。したがって、これを使用して、メモリを割り当ててから、そのメモリに任意の型を構築します。

また、上記のコードの最後の行は double の配列にメモリを割り当てていますが、元のメモリ空間に char 配列が含まれている場合、どのようにそれが可能でしょうか?

何も割り当てていません。指定したメモリを使用して、配列を構築しています。それがplacement newが行うことであり、提供されたメモリ内にオブジェクトを構築します。

配置 new が char 配列のメモリ空間を使用している場合、double 配列を割り当てると、そのメモリ内の char 配列が上書きされるということですか?

はい。

于 2012-11-13T23:58:40.033 に答える
3

はい、char 配列と double 配列はオーバーラップします。具体的には、メモリ内の同じアドレスから開始されます。つまり(long)buffer(long)pd1同じになります。バイトサイズを一致させることで、オーバーラップをさらに強調することができます (仮定sizeof(char) == 1):

const int N = 5;
char buffer[N * sizeof(double)];
double *pd1 = new (buffer) double[N];

はい、データpd1ポイントを変更すると、データ ポイントbufferも変更されます。また、その逆も同様です。-fstrict-aliasing(コンパイラの最適化がこのようなオーバーラップでどのように機能するかについては、GCC フラグも参照してください。)

于 2012-11-13T23:57:54.373 に答える
2

愚かな質問はありません。

char を使用しているのは、おそらく raw バイトについて考えさせるためです (char は通常 1 バイト長です)。コードの最後の行はメモリを割り当てていません。前述のバッファに double 配列を配置するだけです。オブジェクトの場合は、コンストラクターも呼び出します。はい、char配列は上書きされます。

于 2012-11-13T23:57:06.523 に答える
1

記憶は記憶。マシンは、そこに保存されているデータの種類を気にしません。それは、定義して適用する言語次第です。「理由」に対する答えは、「C++ ができるように設計されているため」です。

于 2012-11-13T23:57:27.577 に答える
0

char buffer[BUF];はほんの一部の記憶です。バイト構成バッファに添付された型情報はありません。このメモリ領域が文字を保持することになっていることを知っているのは、コンパイラだけです。double であっても、任意の型を使用できます。

double buffer[BUF];
double *pd1 = new (buffer) double[N];
于 2012-11-14T00:00:44.093 に答える