gpt4 book ai didi

c++ - 为什么在新建数组时不能指定构造函数?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:15:30 24 4
gpt4 key购买 nike

更新:

上面的链接和下面的答案没有回答为什么此功能未标准化。这正是让我好奇的原因。请考虑 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
}

为什么new数组时不能指定构造函数?

为什么 C++ 标准不支持这么方便的功能? 理由是什么?

最佳答案

Why does the C++ standard not support such a handy feature? What's the rationale?

因为有更好的替代方案可以在(几乎)所有用例中替换内置数组(是的,即使是传递给 C-API): std::vector 对于动态数组(使用 new 分配)和 std::array 对于堆栈分配的。

std::vector , 你可以使用 std::vector<A> arr(8, 7) (正如 WhozCraig 评论的那样)它创建了一个包含 8 个元素的 vector ,用 7 个元素初始化它们。省略第二个参数将使用它们的默认构造函数(内置类型用 0false 初始化)。

除了这个和其他便利功能(特别是自动调整大小/push_back() ),std::vector 的最大优势使用 new 创建数组是它遵守 RAII ,这意味着它会自动 delete[]一旦离开范围,它就是对象/内存——无论是否通过“脱离函数的末端”,return声明,break , continue , goto或抛出异常。

关于c++ - 为什么在新建数组时不能指定构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18833260/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com