更新:
上面的链接和下面的答案没有回答为什么此功能未标准化。这就是让我感到奇怪的原因。请考虑std::vector<A> arr(8, 7);
和new A[8](7);
之间的性能问题:
如果我们使用std::vector<A> arr(8, 7);
,则可以(并非必须)执行以下操作:
this->internal_buf = new A[8]; // Call default constructor A() 8 times!
for (auto i = 0; i < 8; ++i)
{
this->internal_buf[i] = A(7); // Call constructor A(7) 8 times AGAIN!!!
}
如果C++支持
new A[8](7);
,则可以按以下方式实现:A* arr = (A*)malloc(sizeof(A) * 8 + extra_size);
for (auto i = 0; i < 8; ++i)
{
new (&arr[i]) A(7); // Call constructor A(7) 8 times ONLY.
}
比较这两种方法,很明显
new A[8](7);
比std::vector<A> arr(8, 7);
的更快此外,我也觉得
new A[8](7);
比std::vector<A> arr(8, 7);
更简洁,更富有表现力无论如何,我认为C++应该为程序员提供另一种替代工具,例如此功能。因为C++的理念之一是“为您提供尽可能多的工具,但您不必为不需要的东西付钱”。
以下是原始帖子:
struct A
{
int n;
A() : n() {}
A(int n) : n(n) {}
};
int main()
{
new A[8]; // OK
new A[8](); // OK
new A[8](7); // Error
}
为什么在更新数组时不能指定构造函数?
为什么C++标准不支持这种方便的功能? 的依据是什么?
最佳答案
因为有更好的替代方法可以(几乎)在所有用例(是的,甚至传递给C-API)中替换内置数组: std::vector
用于动态数组(与new
一起分配)和 std::array
用于堆栈分配的数组。
使用std::vector
,您可以使用std::vector<A> arr(8, 7)
(如WhozCraig所评论的那样),它创建一个由8个元素组成的 vector ,并用7初始化每个元素。省略第二个参数将使用其默认构造函数(内置类型用0
或false
初始化)。
除了此功能和其他便利功能(尤其是自动调整大小/push_back()
)之外,std::vector
相对于使用new
创建数组的最大优势是它遵循RAII,这意味着它将在离开范围后立即自动delete[]
它是对象/内存-否不管是通过“终止函数的结尾”,return
语句,break
,continue
,goto
还是引发异常。
关于c++ - 为什么在更新数组时不能指定构造函数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18833260/