c++字符串输出引用参数或返回值,是否有最优的方法
C++ String output reference parameter or return value, is there an optimal approach?
示例代码:
class Thingy
{
public:
void doStuff(std::string&);
std::string doStuff();
};
void Thingy::doStuff(std::string& str) {
str = "stuff";
}
std::string Thingy::doStuff() {
return "stuff";
}
int main(int argc, const char* args[])
{
std::string name;
Thingy thingy;
thingy.doStuff(name);
std::cout << name << " " << thingy.doStuff() << std::endl;
}
特别是对于字符串,这两种方法是否更有效,这种效率是否"值得"去扭曲代码的可读性或一致性?(例如,如果没有必要,我宁愿不创建name变量)
事实上,这是(在一天结束时)一个字符串常数相关的讨论?
在std::string
上不再允许写时复制语义,因此,表面上,您可能会认为按值返回字符串由于进行深度复制而在计算上很昂贵。
但是,在c++ 03中,一个好的编译器将省略深层拷贝。在c++ 11中,将调用move构造函数。不接受超值拷贝。
我个人不喜欢传递一个非const
引用到函数的模式,因为它不是立即明显的调用者,参数被修改。您也不能将匿名临时对象传递给这样的函数(当然,在本例中您不希望这样做)。编写返回字符串的函数给了你所有的优点而没有缺点。
返回字符串方法更有效,因为它只值一个字符串构造(由于RVO)。对我来说也更容易理解。
如果字符串不长,那么按值返回也不是那么糟糕!特别是,它将允许使用".
"操作符连接东西。而且,现在在c++ 11中,当move constructor
出现时,与按值返回相关的性能问题已经显著减少。
相关文章:
- 是否可以为 QPixmap 派生类嵌入缩放方法?
- 是否有内置方法可以强制转换为不同的基础类型,但保留常量限定符?
- 跨 DLL 边界访问虚拟方法是否安全/可能?
- 是否可以依赖函数范围的静态变量来执行程序关闭期间调用的方法?
- 有没有一种优雅而快速的方法来测试整数中的 1 位是否位于连续区域
- 有没有办法在 c++ 中同时生成随机数?如果没有,是否有解决方法?
- 是否可以使用基类非虚拟方法中的派生类虚拟方法?
- 检查两个节点在子节点上是否具有相同状态的更优雅的方法
- 检查类是否在方法中实例化
- C++方法是否可以根据传递给构造函数的参数具有不同的返回类型?
- 使用类在C++中存储和列出变量/方法是否是一种好的做法
- 是否有通用方法可以找到任何以 null 结尾的字符串的长度?
- 检查类方法中是否(此 == nullptr)
- 是否可以从C++程序中调用 ACPI 方法?
- 是否可以将不可复制的成员用作使对象不可复制的替代方法?
- 是否有一种标准方法来计算两个 asctime() 值之间的天数
- C++方法实现:是否可以避免每次都键入类名?
- 是否有正确的方法对生成文件中的对象文件使用模板命令?(C++)
- 在销毁期间从另一个线程调用对象上调用方法是否未定义行为?
- 使用 std::vector::swap 方法在C++中交换两个不同的向量是否安全?