相关疑难解决方法(0)

将operator new(sizeof(T)*N)返回的内存作为数组处理

在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#4http://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:

  • 是否可以在C++中对动态数组使用malloc()?
  • 是否可以在没有alignas关键字的旧C++中为动态数组使用operator new()和placement new?
  • 在运算符new()返回的内存上使用poiner算术未定义的行为?
  • Sutter建议代码哪些可能会破坏某些古董机器?

对不起,如果这是愚蠢的.

c++ arrays placement-new language-lawyer alignas

9
推荐指数
2
解决办法
307
查看次数

标签 统计

alignas ×1

arrays ×1

c++ ×1

language-lawyer ×1

placement-new ×1