gpt4 book ai didi

c++ - 当编译器知道长度时,为什么不优化字符串赋值?

转载 作者:行者123 更新时间:2023-11-30 01:00:43 24 4
gpt4 key购买 nike

我今天在玩一些计时代码,发现当将字符串文字分配给 std::string 时,速度提高了大约 10%(使用 12 个字符的短字符串,对于大字符串可能会有更大的差异)使用已知长度的文字(使用 sizeof 运算符)而不是这样做。 (只用 VC9 编译器测试过,所以我猜其他编译器可能做得更好)。

std::string a("Hello World!");
std::string b("Hello World!", sizeof("Hello World!");//10% faster in my tests

现在我怀疑的原因是它必须调用 strlen(VC9 进入汇编,这不是我的强项,所以我不能 100% 确定)来获取字符串长度,然后执行与第二种情况相同的操作无论如何。

鉴于 std::string 已经存在了多长时间,以及第一种情况在现实世界的程序中有多常见(特别是如果您包含 +、=、+= 等运算符和等效方法)它为什么没有优化第一个案例变成第二个案例?如果它是一个 std::basic_string 对象和一个文字,那么编译它似乎也很简单,就像它写成 b 一样?

最佳答案

第一个不能优化成第二个。第一种,字符串的长度未知,因此必须计算;第二种,你告诉它它有多长,所以不需要计算。

并且使用 sizeof() 没有区别 - 这也是在编译时计算的。第一种情况使用的构造函数是:

 string( const char * s );

此构造函数无法检测到它被赋予了字符串文字,更不用说在编译时计算其长度了。

此外,从 C 风格的字符串文字构造字符串在实际代码中发生的情况相对较少 - 它根本不值得优化。如果您确实需要优化它,只需重写:

while( BIGLOOP ) {
string s( "foobar" );
...
}

作为:

string f( "foobar" );
while( BIGLOOP ) {
string s( f );
...
}

关于c++ - 当编译器知道长度时,为什么不优化字符串赋值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2173743/

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