gpt4 book ai didi

c++ - 如何在 C++ 中为每个对象使用单独的构造函数参数动态分配对象数组?

转载 作者:行者123 更新时间:2023-11-30 03:30:15 25 4
gpt4 key购买 nike

假设我有一个类

class Foo
{
public:
Foo (const std::string&);
virtual ~Foo()=default;
private:
//some private properties
};

而且我想创建这个类的许多实例。由于我的目标是获得良好的性能,因此我想一次为所有这些内存分配内存(此时,我知道确切的数字,但仅限于运行时)。但是,每个对象都应使用来自参数 vector 的单独构造函数参数构造

std::vector<std::string> parameters;

问题:如何实现?

我的第一次尝试是从 std::vector<Foo> 开始然后 reserve(parameters.size())并使用 emplace_back(...)在一个循环中。但是我不能使用这种方法,因为我使用指向单个对象的指针,并希望确保它们不会被 std::vector 的内部方法移动到内存中的不同位置。 .为避免这种情况,我尝试删除 Foo 的复制构造函数以确保在编译时不会调用任何可能将对象复制到其他位置的方法,但我无法使用 emplace_back(...)了。原因是在这个方法中,vector 可能想要增长并将所有元素复制到新位置,它不知道我预留了足够的空间。

最佳答案

我看到三种可能性:

  • 将 vector 与 reserve 结合使用+ emplace_back .您可以保证,只要您不超过容量,您的元素就不会移动。
  • 使用 malloc + placement new。这允许您分配原始内存,然后一个一个地构造每个元素,例如在一个循环中。
  • 如果您已经有了一系列参数来构造您的对象,如示例中所示,您可以(取决于您对 std::vector 的实现)像这样使用 std::vector 的基于迭代器的构造函数:
    std::vector<Foo> v(parameters.begin(),parameters.end());

第一个解决方案的优点是简单得多,并且具有 vector 的所有其他好处,例如处理破坏、保持大小等。第二种解决方案可能更快,因为您不需要做 vector emplace_back 的内务管理工作。如果这对您很重要,它甚至可以使用已删除的移动/复制构造函数,但它会给您留下许多错误的可能性

第三种解决方案 - 如果适用 - 恕我直言是最好的。它还适用于已删除的复制/移动构造函数,不应有任何性能开销,并且它为您提供了使用标准容器的所有优势。
然而,它确实依赖于构造函数首先确定范围的大小(例如通过 std::distance ),我不确定这是否对任何类型的迭代器都有保证(实际上,所有实现至少对随机访问迭代器都这样做).同样在某些情况下,提供适当的迭代器需要编写一些样板代码。

关于c++ - 如何在 C++ 中为每个对象使用单独的构造函数参数动态分配对象数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45127803/

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