演员之后的指针算术

时间:2013-07-24 14:54:03

标签: c++ c++11

考虑以下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.

这合法吗?关于在演员表演后做指针算术的标准是什么? 5.7 / 5的C ++ 11标准讨论了关于指向数组对象元素的指针的算术,但可以将任何连续的内存块视为数组吗?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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