提问人:glades 提问时间:10/7/2022 更新时间:10/7/2022 访问量:109
更改数据成员的最有效方法
Most efficient way to mutate data member
问:
我一直在想这个问题很久了。为数据成员(突变)分配新值的最惯用和/或最有效的方法是什么?我能想到 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 方法只使用一个取消引用(除了必须取消引用才能调用该方法,但也许这可以通过智能编译器进行优化)。
另外,我想知道什么是最惯用/最清晰和最不容易出错的?也许比我多一些年限的人可以在这里给我一些见解!
答: 暂无答案
评论
assign_direct
(尽管通常你会传入一个参数 ofc)。其他两个对我来说根本没有意义,无论效率如何。str_ = "Hello World!";
internal_func()
str_
assign_direct