Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 创建并返回字符串向量-最有效的解决方案?_C++_Vector_Construct - Fatal编程技术网

C++ 创建并返回字符串向量-最有效的解决方案?

C++ 创建并返回字符串向量-最有效的解决方案?,c++,vector,construct,C++,Vector,Construct,在成员函数中,我想返回一个新创建的字符串向量。 从内存分配和构造函数调用的角度来看,哪个版本最有效字符串(i)返回一个常量std::字符串& std::vector<std::string> result(depth()); for(int i=0;i<depth;i++) { result[i] = theString(i); } std::向量结果(depth()); 对于(int i=0;i不可能给出一个通用的答案:根据您的编译器、使用的标准库实现、目标CPU和

在成员函数中,我想返回一个新创建的字符串向量。 从内存分配和构造函数调用的角度来看,哪个版本最有效<代码>字符串(i)返回一个
常量std::字符串&

std::vector<std::string> result(depth());
for(int i=0;i<depth;i++) {
    result[i] = theString(i);
}
std::向量结果(depth());

对于(int i=0;i不可能给出一个通用的答案:根据您的编译器、使用的标准库实现、目标CPU和周围的源代码,发出的代码可能会有所不同。此外,一种解决方案或另一种解决方案的速度是否更快也可能会受到di引起的缓存效应或线程切换效应的影响不同的日程安排

因此,不幸的是,没有通用的答案:用你的设置进行测量

话虽如此,让我提出另外两位候选人:候选人3:

// The simplest code is always easier to read:
std::vector<std::string> result;
for (size_t i = 0; i < depth; ++i) { result.emplace_back(theString(i)); }

后者依赖于哪个是一个非常简单的实现(基本上是一对
size\u t
char const*
)但是,只有当引用的字符串保证在上次使用
string\u视图

时仍然有效时,才可以使用它。在查找bug时,哪个代码段更容易维护,或者忽略哪个代码段。因此,我会想象编译器会将两者优化为相同的代码,检查程序集输出是否存在任何差异。正如Alf所提到的,可读性远比这些微优化更重要。因此,选择最容易阅读和维护的内容。好吧,可读性没有太大区别,而且它肯定是在速度关键的部分。应用第二条规则。@shuttle87:事实上,这不太可能。但它是否会对sp产生影响呢这是另一个问题。
// The simplest code is always easier to read:
std::vector<std::string> result;
for (size_t i = 0; i < depth; ++i) { result.emplace_back(theString(i)); }
// If no copy is necessary, then no copy is cheaper:
std::vector<std::string_view> result; // or another "StringRef" alternative
for (size_t i = 0; i < depth; ++i) { result.emplace_back(theString(i)); }