所以在组合字符串的时候,往往会有常量的组成部分,例如:
std::string s;
s += initial_string;
s += "const string";
s += terminating_string;
这只是一个演示,字符串操作可能更加复杂和深入。因此,在执行 const 部分时,实现最终“不知道”长度并有效地strlen()
对其进行了 a 。显然这是一种浪费,因为长度在编译时是已知的。我已经测试过用它替换 const 字符串部分要快得多(无论出于何种原因,在 x64 中基本上更多):
s.append("const string",12);
实际计算字符很烦人、耗时且容易出错,所以这要好一些:
s.append("const string",sizeof("const string")-1);
这仍然有点容易出错(即更改第一部分但忘记更改第二部分),因此宏可以帮助做到这一点:
#define strnsizeof(s) s,sizeof(s)-1
s.append(strnsizeof("const string"));
问题1:有人对此有更好/更清洁的解决方案吗?
我还有一个扩展的字符串类,在其中我使用<<
运算符来连接字符串和各种其他对象类型。这里有类似的问题,这很好很干净(对我来说):
s << initial_string << "const string" << terminating_string;
当我有一个我自己的对象类型的运算符(其中长度是一个组件)时,追加操作又快又容易,但是当它const char *
再次到达这里时,即使它在编译时是恒定的,我也没有得到长度。const char *
因此,我可以通过创建一个采用 a和 length的小结构来加快速度:
s << initial_string
<< MyStr::ConstBuf(strnsizeof("const string"))
<< terminating_string;
男孩越来越丑了。所以我也可以将其宏化,例如:
#define MyStrConst(s) MyStr::ConstBuf(s,sizeof(s)-1)
s << initial_string
<< MyStrConst("const string")
<< terminating_string;
更好但不是很好。
问题 2:有没有比封装常量字符串更好/更清洁的解决方案?