[英]Why isn't string assignment optimised when the length is known to the compiler?
我今天在玩一些计时代码,发现将字符串文字分配给std :: string时,这样做的速度要快10%左右(短的12个char字符串,所以大字符串的差异更大)使用已知长度的文字(使用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 );
...
}
毫无疑问,编译器可以执行以下操作,实际上您可以自己执行以下操作:
template<size_t SIZE>
std::string f(const char(&c)[SIZE]) {
return std::string(c, SIZE);
}
int main() {
std::string s = f("Hello");
cout << s;
}
甚至使用自定义派生类型(尽管没有理由std :: string不能具有此构造函数):
class mystring : public string {
public:
template<size_t SIZE>
mystring(const char(&c)[SIZE]) : string(c, SIZE) {}
};
int main() {
mystring s("Hello");
cout << s;
}
一个很大的缺点是针对每个不同的字符串大小都会生成一个函数/构造函数的版本,如果编译器不能很好地处理模板提升,则整个类甚至可以被复制...在某些情况下,这些可能会破坏交易情况。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.