gpt4 book ai didi

c++ - 初始化方法与构造函数加赋值——有什么性能差异吗? (C++)

转载 作者:行者123 更新时间:2023-11-28 07:30:30 27 4
gpt4 key购买 nike

我已经使用 C++ 编程很长时间了,所以我为不知道这一点而感到愚蠢但是......

我经常编写对性能敏感的代码,当我这样做时,我尽量避免堆分配。为此,我经常重复使用预先分配的小对象数组,而不是为每个单独的对象调用 new 和 delete。

在这种情况下,我通常这样做:

class MyClass
{
private:
int x, y;

public:
inline void Set(_x, _y) { x = _x; y = _y; }
};

...

MyClass &objectToReuse = someArray[someIndex];

objectToReuse.Set(someXValue, someYValue);

但是我怀疑这个更好看的版本会生成相同的代码:

class MyClass
{
private:
int x, y;

public:
inline MyClass(_x, _y) : x(_x), y(_y) {}
};

...

MyClass &objectToReuse = someArray[someIndex];

objectToReuse = MyClass(someXValue, someYValue);

现代 C++ 编译器会“获取”这个,还是会构造一个临时对象然后复制它?

最佳答案

是的,一个好的编译器会消除这种情况下的额外开销。

我说“在这种情况下”是因为它在很大程度上取决于构造函数中发生的事情(以及赋值运算符 - 它说“下面的构造函数/构造,读作”或赋值运算符)。如果构造函数影响(或“可能影响”)全局状态,则编译器无法删除构造。影响全局状态的是读取或写入文件,更新全局变量,几乎所有对编译器“不知道”的函数的调用“(没有源代码)将导致构造函数/拷贝消除“失败”。

当然,如果不消除构造函数/拷贝,使用 setter 的代码可能会更高效。在实际场景中,确切的衡量标准只能通过基准测试才能真正确定,因为通常很难准确判断一行或多行代码在优化编译时实际产生的影响——看起来非常简单的东西有时会产生相当大的影响,看起来复杂的东西可以(虽然不太常见=最终根本不会花费太多时间。

关于c++ - 初始化方法与构造函数加赋值——有什么性能差异吗? (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17832228/

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