3

次の C++ 疑似コードを検討してください。

// Pointer to contiguous memory block suitably aligned to contain
// an array of type T. Possibly obtained via std::malloc or std::aligned_storage.
void *buffer = ...;
// Now cast as T pointer.
T *ptr = static_cast<T *>(buffer);
// Do some pointer arithmetics. For instance, construct the first two
// elements of the array.
::new (ptr) T();
::new (ptr + 1) T();
// etc.

これは合法ですか?キャスト後にポインター演算を行うことについて、標準は何と言っていますか? C++11 標準の 5.7/5 では、配列オブジェクトの要素へのポインターの算術演算について説明していますが、連続したメモリ ブロックを配列と見なすことはできますか?

4

2 に答える 2

0

はい、これは合法です。ポインター演算は、実際には型キャストとは何の関係もありません。そこにあるのは、基礎となる型のサイズに等しい増分を使用してアドレスの計算を行うことだけです。これらの操作はポインタ (そのアドレスが指すメモリの読み取り/書き込み) を逆参照しないため、オブジェクトの初期化の前に安全に使用できます。はい、連続したメモリ ブロックを配列として参照できます。

于 2013-07-24T15:00:34.610 に答える