gpt4 book ai didi

c++ - move 构造函数矫枉过正

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:19:59 25 4
gpt4 key购买 nike

我有一个类,它包含指向一大块已分配内存和许多原始类型成员的指针。我正在研究 move 构造函数,认为这是使用它的绝好机会。显然,指针应该移过去,但如果对原语来说是个好主意,我不知道。

下面是该类的人为示例:

class Foo {
private:
long m_bar = 1;
/* 20+ similar members */
};

要使它们可 move ,必须动态分配它们。

class Foo {
public:
Foo(Foo && rhs) : m_bar(rhs.m_bar) { rhs.m_bar = nullptr; }
~Foo() { delete m_bar; }
private:
long *m_bar = new long{1};
};

我的问题是,在堆上分配的开销是否会抵消 move 语义带来的性能提升?

最佳答案

如果有的话,我相信像这样分配每个成员的堆最终会变慢。在初始堆分配之上,仅在构造时执行,在堆上保存指向许多小的、不连续的数据成员的指针不能很好地与 CPU 缓存策略配合使用。

有些类 move 得非常好,因为它们有大量的堆分配内存(例如 std::string)。在您的情况下, move 每个指针将与 move 较小的数据类型一样昂贵。我能看到这更快的唯一方法是,如果您将较小的数据成员包装在堆分配的类/结构中(可能持有一个 unique_pointer 到它。)并通过单个指针的 move move 所有它们。

也就是说,这很可能是过早优化的情况。您可能希望让代码按原样运行,并确定为您的类实现更复杂的 move 语义确实可以真正提高代码的性能。

关于c++ - move 构造函数矫枉过正,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13456476/

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