我走了一个非常简单的问题,但不幸的是我自己无法找到答案。

假设我有一些数据结构,可以保存设置和表现,就像设置图一样。我有一个 GetValue(const std::string& name) 方法,返回相应的值。

现在我试图弄清楚 - 哪种返回价值方法会更好。显而易见的是使我的方法的行为

std::string GetValue(const std::string& name) const

并返回对象的副本,并依靠RVO在性能含义中。

另一个将意味着制作两种方法

std::string& GetValue(...)
const std::string& GetValue(...) const

这通常意味着复制代码或使用一些邪恶的常数铸件两次使用这些例程之一。

#

在这种情况下,您的选择是什么?为什么?

有帮助吗?

解决方案

实际上我可能会使用:

std::string GetValue(const std::string& name) const;
// or
const std::string* GetValue(const std::string& name) const;

void SetValue(std::string name, std::string value);

首先:

  • 通过价值传递 SetValue 允许编译器通过const-Reference通过传递而无法通过的一些优化,这已在Dave Abrahams的文章中进行了解释, “想要速度?按价值传递。”
  • 用一个 Setter 通常会更好,因为您可以检查设置的值,而通过平均参考,您不能保证呼叫者不会对数据做任何愚蠢的事情。

对于getter:

  • 通过复制返回似乎是浪费的,因为大多数时候您不会修改返回的对象(对于设置图),但是指针或参考确实意味着对象别名会寿命足够长,如果您不能保证它,那么重点是moot:按价值返回。还要复制允许避免暴露内部细节,例如,如果您突然切换到 std::wstring 因为您需要在UTF-8中进行一些设置...
  • 如果您需要表现,那么您就可以在该部门做一些让步。但是,引用不允许您在指针使其变得容易的同时(除非有魔术值)发出信号(除非您有一些魔术值)(NULL已经为您删除)。

其他提示

这取决于用法。应该 GetValue("foo") = "bar" 说得通?在这种情况下,按价值返回不会做您想要的。

如果您可以通过const引用返回,请执行。返回像std ::字符串之类的内存管理类的唯一原因是因为它是临时字符串。

这是C ++的非常“敏感”点。恕我直言,这是C ++设计中最弱点之一。 Afaik没有真正的好选择,这既是外观又表现不错的选择。

应该提到的一个点,RVO优化通常只能完成工作的一部分。没有这样的典型表达:

std::string txt = GetValue("...");

实际上将产生2份!取决于编译器,但通常RVO优化仅消除了一个副本,但另一个仍然存在。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top