更改数据成员的最有效方法

Most efficient way to mutate data member

提问人:glades 提问时间:10/7/2022 更新时间:10/7/2022 访问量:109

问:

我一直在想这个问题很久了。为数据成员(突变)分配新值的最惯用和/或最有效的方法是什么?我能想到 3 个选项:

  • 直接从方法内部进行更改
  • 使用引用来改变对象
  • 将方法的返回值分配给数据成员 (RVO)

下面是一个演示。在阅读程序集时,请考虑编译器可能优化了这个人为示例中的大部分差异,但我只是想以最简单的方式展示这些选项。请回答此方法涉及较多的情况。

演示

#include <string>
#include <cstdio>

struct some_struct
{

    auto assign_direct() {
        str_ = "Hello World!";
    }

    auto assign_through_ref(std::string& ref) {
        ref = "Hello World!";
    }

    auto assign_through_RVO() {
        const std::string ret = "Hello World!";
        return ret;
    }

    void internal_func() {

        assign_direct();

        assign_through_ref(str_);

        str_ = assign_through_RVO();
    }

    std::string str_;
};

int main()
{
    some_struct s;
    s.internal_func();
}

我的想法是,直接分配和复制分配必须同样有效,因为它们取消引用 this-pointer,然后取消引用数据成员的有效地址。因此,涉及两个取消引用,而 assign_thorugh_ref 方法只使用一个取消引用(除了必须取消引用才能调用该方法,但也许这可以通过智能编译器进行优化)。

另外,我想知道什么是最惯用/最清晰和最不容易出错的?也许比我多一些年限的人可以在这里给我一些见解!

C++(英语:C++) 方法 C++20 可变 DataMember

评论

4赞 Paul Sanders 10/7/2022
assign_direct(尽管通常你会传入一个参数 ofc)。其他两个对我来说根本没有意义,无论效率如何。
0赞 Jakob Stark 10/7/2022
你能解释一下“惯用/清晰且最不容易出错”吗?我认为这些术语在不同的上下文中确实具有完全不同的含义。您还错过了直接在 .str_ = "Hello World!";internal_func()
0赞 πάντα ῥεῖ 10/7/2022
了解特定编译器如何处理这些赋值的最佳方法是检查发出的汇编代码。这也可能因各种编译器和优化级别而异。
0赞 Daniel Langr 10/7/2022
如果需要将新值赋值给 ,只需赋值即可。为什么你认为它会效率低下,或者其他一些解决方案会更好?str_assign_direct
0赞 glades 10/7/2022
@JakobStark Ofc 在这个例子中,这是可行的,但让我们假设我们出于某种原因(例如,非常复杂的计算等)将其放入函数中

答: 暂无答案