注意:我提出这个问题是作为一个特定于std::string的问题,而不是一般的“如何传递对象”的问题。我想删除这个问题,但由于它已经有了答案,所以我不能删除它。我相信答案可能会趋向于回答更一般的问题:“在C++中传递对象的最佳方法是什么?”即使这个具体的问题本身可能不是一个重复的问题,在stackoverflow上有很多这些更一般的答案的副本。这种退化可能是因为这个问题是一个不恰当的问题,std::string类并没有什么特别之处。这个问题没有得到高票,这表明它不太有趣。如果是这样,那就是我的错。也许管理员会看到这段黑色文字,对我表示怜悯,并删除这个问题。
以下哪个签名代表着将非const的std::string实例传递给一个不修改它的函数的最快方法,考虑到在调用站点包括是否在调用之前生成底层字符数组的深度复制的总体开销?
以下哪个签名代表着将非const的std::string实例传递给一个不修改它的函数的最快方法,考虑到在调用站点包括是否在调用之前生成底层字符数组的深度复制的总体开销?
extern void eat_string_by_value (std::string s);
extern void eat_const_string_by_value (const std::string s);
extern void eat_string_by_reference (std::string& s);
extern void eat_const_string_by_reference(const std::string& s);
注意:我提出这个问题是一个与std::string
特定相关的问题,而不是一个关于一般对象传递的问题。特别是,我的问题是由以下问题引发的:
std::string
句柄体实现:其中任何一个签名是否意味着在调用站点深度复制字符串体及其后备字符数组?- 请注意复制句柄(应该是轻量级的)和复制主体(它将涉及内存分配)之间的区别。
- C++98与C++>=11: 在这个版本划分的两侧是否有不同的答案?
我不认为我的问题是这个以前的问题的重复,这个问题本身被标记为一般对象传递问题的重复<Pass arguments as std::string or const std::string&?> ,因为这些类型特定的详细说明。
一个相关问题的有趣答案: