繁体   English   中英

当编译器知道长度时,为什么不优化字符串分配?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM