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