class I {
public:
virtual std::wstring const& GetName() const = 0;
};
通常,实现此接口的客户端在其正文中包含其名称。一切正常。但有时候,'GetName'的结果是在函数执行期间计算的。使用静态变量来存储结果不是一个好主意。但按值返回需要额外的性能开销。
那么这个问题怎么解决?感谢。
答案 0 :(得分:4)
但按价值回归需要 额外的性能开销。
事实并非如此。编译器通常可以使用Return Value Optimization来删除副本。
答案 1 :(得分:0)
不要猜测性能问题:虽然人们经常通过const引用返回std::string
,但按值返回值并不是什么大问题,特别是如果你别无选择。
实际上,有时甚至可以更改后者,因为它只影响客户端代码的一些内容。
记住:过早优化是万恶之源。
现在,要完全回答这个问题,你可以在虚函数中完美地返回一个引用(无论它是纯粹的还是不真实的)。确保永远不要返回对临时的引用。
如果某些派生类需要执行代价高昂的计算,它仍然可以将结果存储在成员std::wstring
中并返回对该成员的引用。但是再一次,不要猜测性能问题:首先测量并关注它,只有这似乎是瓶颈。
答案 2 :(得分:0)
确定在什么意义上?这是合法的C ++。通常编程很糟糕
练习,因为你提到:它强加了(通常)不必要的
对派生类的限制。你应该独立于virtual
只有当函数的语义需要它时才返回引用;
如果类型具有值语义,如std::string
,则会这样
只是一个非const引用。 (模板在某种程度上使问题复杂化,
像std::vector
这样的类返回a是合理的
从operator[] const
引用const。)
答案 3 :(得分:0)
这似乎是一个坏主意。如果开销真的很重要,你可以使用一些带有隐式共享的字符串容器(写时复制语义),比如QString
。
答案 4 :(得分:0)
虽然其他人似乎都认为这是一个非常糟糕的主意(由于各种原因,所有这些都有些真实),但我没有看到任何从根本上错误返回{ {1}}。
这样做
所以,虽然有点不寻常,但是如果它做了你想要的(特别是明确表示调用者可能不会修改字符串),我认为没有绝对的理由不这样做。