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

2

是的,这是合法的。在算术方面,ptr + 1实际上与((uint8)ptr) + (sizeof(*ptr)*1)任何类型指针相同。所以是的,给定任何类型化的指针,指向的内存可以被视为该指针类型的连续元素数组,并且您可以使用类型转换来更改任何给定指针算术运算的行为。

于 2013-07-24T15:10:07.673 回答
0

是的,这是合法的。指针算术与类型转换没有任何关系。它的所有内容都是使用等于基础类型大小的增量对地址进行数学运算。由于这些操作不会取消引用指针(该地址指向的读/写内存),因此在对象初始化之前使用是安全的。是的,您可以将连续的内存块称为数组。

于 2013-07-24T15:00:34.610 回答