【发布时间】:2013-09-20 21:53:54
【问题描述】:
更新:
上面的链接和下面的答案没有回答为什么这个功能没有标准化。这正是让我想知道的原因。请考虑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++ 标准不支持这么方便的功能? 原因是什么?
【问题讨论】:
-
您可以为数组指定一个初始化器。但是数组的初始化器与要应用于每个元素的数组元素的初始化器不同。另外,
new分配的数组在这方面与其他数组没有什么不同。 -
抱歉学究但
this->internal_buf[i] = A(7);错了;应该是new (&this->internal_buf[i]) A(7);。
标签: c++ arrays c++11 constructor initialization