gpt4 book ai didi

c++ - std::push_back 使用起来相对昂贵吗?

转载 作者:行者123 更新时间:2023-12-05 01:15:21 25 4
gpt4 key购买 nike

我想提高以下代码的性能。执行代码时哪些方面可能会影响代码的性能?

此外,考虑到您可以向容器中添加多少个对象没有限制,可以对“Object”或“addToContainer”进行哪些改进以提高程序的性能?

我想知道 C++ 中的 std::push_back 是否会以任何方式影响代码的性能?特别是如果添加到列表没有限制。

struct Object{
string name;
string description;
};

vector<Object> container;
void addToContainer(Object object) {
container.push_back(object);
}

int main() {
addToContainer({ "Fira", "+5 ATTACK" });
addToContainer({ "Potion", "+10 HP" });
}

最佳答案

在你做任何事情之前分析代码并获得一个基准。在您对代码进行更改配置文件并获得基准后。比较基准。如果你不这样做,你就是在掷骰子。它更快吗?谁知道。

个人资料个人资料。

对于 push_back,您有两个主要问题:

  1. vector 填满时调整它的大小,并且
  2. 将对象复制到 vector 中。

根据添加项目的方式,您可以对 push_back 的调整成本成本进行多项改进。

例如,策略性地使用 reserve 来最小化调整大小的数量。如果您知道要添加多少项目,您可以检查容量大小,看看是否值得您花时间reserve避免多次调整大小。请注意,这需要了解 vector 的扩展策略,并且是特定于实现的。对一个 vector 实现的优化可能对另一个实现来说是一个非常严重的错误。

您可以使用insert 一次添加多个项目。当然,如果您需要将另一个容器添加到代码中以进行批量插入,这几乎是无用的。

如果您不知道有多少项目传入,您不妨让 vector 完成它的工作并优化项目的添加方式。

例如

void addToContainer(Object object) // pass by value. Possible copy 
{
container.push_back(object); // copy
}

这些拷贝可能很昂贵。摆脱它们。

void addToContainer(Object && object) //no copy and can still handle temporaries
{
container.push_back(std::move(object)); // moves rather than copies
}

std::string 的移动成本通常非常低。

addToContainer 的这种变体可以用于

addToContainer({ "Fira", "+5 ATTACK" });
addToContainer({ "Potion", "+10 HP" });

并且可能只迁移一个指针和每个 string 的尽可能少的簿记变量。他们是临时工,所以没人在乎它会不会把他们的内脏撕掉,然后把尸体扔掉。

至于现有的对象

Object o{"Pizza pop", "+5 food"};
addToContainer(std::move(o));

如果它们是消耗品,它们也会被移动。如果它们不是消耗品...

void addToContainer(const Object & object) // no copy
{
container.push_back(object); // copy
}

你有一个重载,很难做到这一点。

把这个扔出去

如果您已经有许多项目,您知道这些项目将出现在列表中,而不是一次将它们全部附加到列表中,请使用初始化列表:

vector<Object> container{
{"Vorpal Cheese Grater", "Many little pieces"},
{"Holy Hand Grenade", "OMG Damage"}
};

关于c++ - std::push_back 使用起来相对昂贵吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56370244/

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