【发布时间】:2020-08-20 16:27:00
【问题描述】:
像许多人一样,我习惯于将新的字符串函数编写为const std::string & 的函数。优点是效率(您可以传递现有的std::string 对象,而不会产生复制/移动的开销)和灵活性/可读性(如果您只有const char *,您可以传递它并隐式完成构造,而不会造成混乱您的代码具有显式 std::string 构造):
#include <string>
#include <iostream>
unsigned int LengthOfStringlikeObject(const std::string & s)
{
return s.length();
}
int main(int argc, const char * argv[])
{
unsigned int n = LengthOfStringlikeObject(argv[0]);
std::cout << "'" << argv[0] << "' has " << n << " characters\n";
}
我的目标是编写能够有效处理长字符串的高效跨平台代码。我的问题是,在隐式构造过程中会发生什么?是否有任何保证不会复制字符串?令我震惊的是,因为一切都是const,所以不需要复制——只需要一个围绕现有指针的薄 STL 包装器——但我不确定我应该如何依赖编译器和平台.始终显式编写两个版本的函数会更安全吗,一个用于const std::string &,一个用于const char *?
【问题讨论】:
-
你不能总是用
std::strings 代替char *吗?我的意思是argv[0]只能复制一次到std::string,其余的都可以是std::string -
@idclev463035818 假设它可能是一个非常大的字符串,我想避免在内存中复制它,即使在开始时也是如此。
-
我写了两个函数(或成员函数)以防我想避免复制 const char *。但这些情况是有限的。我想答案取决于有多少功能需要这个?
标签: c++ string stl constants implicit-constructor