1
32
就我个人而言,我会选择不在数组中使用placement new,而是在数组中的每个项目上单独使用placement new。例如:
笔记 我还没有编译过,但我认为它应该工作(我在一个没有安装C++编译器的机器上)。它仍然表明了这一点:)希望它在某种程度上有所帮助! 编辑:
|
2
5
5.3.4,第12节讨论了数组分配开销,除非我误读了它,否则它似乎向我建议编译器将其添加到新位置也是有效的: 也就是说,我认为VC是唯一一个给我带来麻烦的编译器,除了GCC、Codewarrior和ProDG。不过,我得再检查一下。 |
3
4
@詹姆斯
考虑过这一点后,我同意你的看法。没有理由认为placement new需要存储元素的数量,因为没有placement delete。由于没有放置删除,因此没有理由使用新放置来存储元素的数量。 我还在Mac上用gcc测试了这一点,使用了一个带析构函数的类。在我的系统中,位置是新的 不 更改指针。这让我想知道这是否是一个VC++问题,以及这是否会违反标准(据我所知,标准并没有专门解决这个问题)。 |
4
3
我甚至不太清楚它为什么需要额外的数据,因为您无论如何都不会在数组上调用delete[],所以我不完全明白它为什么需要知道其中有多少项。 |
5
3
Placement new本身是可移植的,但是您对它使用指定内存块所做的假设是不可移植的。就像前面所说的,如果你是一个编译器,并且有一块内存,如果你只有一个指针,你怎么知道如何分配一个数组并正确地销毁每个元素?(见操作员删除[]界面) 编辑: 实际上有一个placement delete,只有当构造函数在分配placement new[]数组时抛出异常时才会调用它。 new[]是否真的需要以某种方式跟踪元素的数量取决于标准,这取决于编译器。不幸的是,在这种情况下。 |
6
2
与使用单个元素计算一个新放置的大小类似,使用这些元素的数组计算数组所需的大小。 如果您需要其他计算的大小,而元素数量可能未知,则可以使用sizeof(A[1])并乘以所需的元素计数。 例如
|
7
1
我认为gcc和MSVC做了同样的事情,但当然这并不能使它“可移植”。
A*p=新(缓冲区)Arr; 这应该使用新的标量放置。 |
Toniq · javascript为php保存多维数组 1 年前 |
Jannis · Java中数组的怪异行为 1 年前 |
callum · 如何识别数组中与给定序列不匹配的元素? 1 年前 |
tenfour · 如何使用数组元素的索引初始化数组元素 2 年前 |
Guillaume · 使用操作从Python列表创建numpy数组 2 年前 |
maxMas · Swift 5:为什么会出现索引超出范围错误? 2 年前 |