gpt4 book ai didi

c++ - 优化字符串创建

转载 作者:行者123 更新时间:2023-11-30 03:57:01 25 4
gpt4 key购买 nike

我有以下使用属性设置文件名的类的模拟代码:

#include <iostream>
#include <iomanip>
#include <sstream>

class Test {
public:
Test() { id_ = 1; }
/* Code which modifies ID */

void save() {
std::string filename ("file_");
filename += getID();
std::cout << "Saving into: " << filename <<'\n';
}

private:
const std::string getID() {
std::ostringstream oss;
oss << std::setw(4) << std::setfill('0') << id_;
return oss.str();
}

int id_;
};

int main () {
Test t;
t.save();
}

我关心的是 getID方法。乍一看,它似乎效率很低,因为我正在创建 ostringstream及其对应的 string返回。我的问题:

1) 因为它返回 const std::string编译器(在我的例子中是 GCC)能够优化它吗?

2)有什么方法可以提高代码的性能?也许移动语义或类似的东西?

谢谢!

最佳答案

创建 ostringstream ,只有一次,在像打开文件这样昂贵的操作之前,对你的程序的效率完全没有影响,所以不用担心。

但是,您应该担心代码中出现的一个坏习惯。值得称赞的是,您似乎已经确定了它:

1) Since it returns const std::string is the compiler (GCC in my case) able to optimize it?

2) Is there any way to improve the performance of the code? Maybe move semantics or something like that?



是的。 考虑:
class Test {
// ...
const std::string getID();
};

int main() {
std::string x;
Test t;
x = t.getID(); // HERE
}

在标记为 // HERE 的行上,调用哪个赋值运算符?我们想调用移动赋值运算符,但该运算符的原型(prototype)为
string& operator=(string&&);

以及我们实际传递给 operator= 的参数属于“对 const string 类型的右值的引用”——即 const string&& . const-correctness 规则阻止我们默默地转换 const string&&string&& ,因此当编译器创建可以在此处使用的赋值运算符函数集(重载集)时,它必须排除采用 string&& 的移动赋值运算符.

因此, x = t.getID();最终调用 复制 -赋值运算符(因为 const string&& 可以安全地转换为 const string& ),并且您制作了一个额外的拷贝,如果您没有养成 const 的坏习惯,就可以避免这种情况。 - 限定您的返回类型。

当然, getID()成员函数可能应该声明为 const ,因为它不需要修改 *this目的。

所以正确的原型(prototype)是:
class Test {
// ...
std::string getID() const;
};

经验法则是: 始终按值返回,绝不返回 const值(value)。

关于c++ - 优化字符串创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28239095/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com