在 C 中,可以使用然后使用指针算法来分配动态数组malloc(sizeof(T) * N)
,然后使用指针算法来获取此动态数组中 i 偏移处的元素。
在 C++ 中,可以operator new()
以与相同的方式使用malloc()
,然后放置 new(例如,可以在 Herb Sutter 的“Exceptional C++:47 个工程难题、编程问题和解决方案”一书中查看第 13 项的解决方案)。如果您没有,则此问题的解决方案摘要将是:
T* storage = operator new(sizeof(T)*size);
// insert element
T* p = storage + i;
new (p) T(element);
// get element
T* element = storage[i];
对我来说,这看起来是合法的,因为我要求一块具有足够内存的内存来保存大小 = 的 N 个对齐元素sizeof(T)
。由于sizeof(T)
应该返回对齐的元素大小,并且它们一个接一个地放置在一块内存中,因此在这里使用指针算法是可以的。
但是,然后我被指向如下链接:http://eel.is/c++draft/expr.add#4或http://eel.is/c++draft/intro.object#def:object并声称在 C++operator new()
中,它不返回数组对象,因此与 ANSI C 相比,它返回的内容并将其用作数组的指针算术是未定义的行为。
我不擅长这么低级的东西,我真的想通过阅读以下内容来理解:https ://www.ibm.com/developerworks/library/pa-dalign/或者这个:http://jrruethe。 github.io/blog/2015/08/23/placement-new/但我仍然无法理解 Sutter 是否完全错了?
我确实明白这alignas
在以下结构中是有意义的:
alignas(double) char array[sizeof(double)];
(c) http://georgeflanagin.com/alignas.php
如果数组似乎不在边界中double
(可能跟随char
在 2 字节读取处理器上运行的结构中)。
但这是不同的——我已经从堆/空闲存储中请求了内存,特别是请求 operator new 返回内存,它将保持元素对齐到sizeof(T)
.
总结一下,如果这是 TL;DR:
- 是否可以
malloc()
在 C++ 中用于动态数组? operator new()
是否可以在没有alignas
关键字的旧 C++ 中使用和放置新的动态数组?- 在返回的内存上使用指针算术是否未定义行为
operator new()
? - Sutter 是否建议可能在某些古董机器上破坏的代码?
对不起,如果这是愚蠢的。