在关于优化和代码风格的C++问题中,在优化副本的上下文中,有几个答案提到了"SSO" std::string.在这种情况下,SSO意味着什么?
显然不是"单点登录"."共享字符串优化",或许?
被std::string使用gcc 4时引用计数-std=c++0x或-std=c++11?
我最近了解到,自几年以来,libstdc ++库包含vstring(也称为versa_string),它提供了相同的功能std::string,但显然更符合C++标准.我曾试图用它vstring作为替代品std::string,但我发现没有简单的方法可以做到.
有没有一种简单的方法来代替std::string用vstring,在不改变的libstdc ++源代码?
我可以用std::string别名替换代码中的所有用法,如下面的清单所示.然而,这种方法的问题在于,它std::string也在某些地方内部使用,例如在std::ostringstream.这意味着,这些陈述std::ostringstream os; my::string s = os.str();不再适用.
namespace my {
#ifdef __GLIBCXX__
using string = __gnu_cxx::__vstring;
#else
using string = std::string;
#endif
}
Run Code Online (Sandbox Code Playgroud) 请考虑以下示例:
int main()
{
string x = "hello";
//copy constructor has been called here.
string y(x);
//c_str return const char*, but this usage is quite popular.
char* temp = (char*)y.c_str();
temp[0] = 'p';
cout << "x = " << x << endl;
cout << "y = " << y << endl;
cin >> x;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在visual studio编译器和g ++上运行它.当我这样做时,我得到了两个不同的结果.
用g ++:
x = pello
y = pello
Run Code Online (Sandbox Code Playgroud)
在visual studio 2010中:
x = hello
y = pello
Run Code Online (Sandbox Code Playgroud)
差异的原因很可能是g ++ std …
假设我有一个函数const string&作为其输入,例如:
void foo(const string& s);
Run Code Online (Sandbox Code Playgroud)
然后我有一个内部缓冲区const char* buffer;,我知道它的大小.
我想如果我创建字符串内联,仍然会发生一个副本:
foo(string(buffer, n));
Run Code Online (Sandbox Code Playgroud)
但是没有必要复制缓冲区,因为所有东西都是常量,我只需要字符串类的功能而不是它创建的缓冲区.
我必须提到我不确定复制是否发生,但是查看字符串的构造函数,所有人都说复制会发生.我不知道编译器优化是否可以理解这种情况,我找不到确定复制是否发生的方法.
有没有办法为字符串使用外部缓冲区,或者至少是确保复制发生与否的方法.我目前正在使用std字符串和c ++ 11.
我在C++ 11 STL中阅读了很多关于内存管理的帖子,但我找不到令人满意的答案.
我的情况:我开发了一个长期运行的服务器[它运行大约4-6周].目前我使用了很多旧的 C代码char [x][y]或char [z]位于堆栈上的变量.
我怀疑 STL内存管理是否仍然可靠,在一个运行数周的程序中广泛使用它,并在此期间服务超过1000万个线程,每个线程将有很多STL操作.
更具体一点:我想重写位于堆栈std::vector<std::string>或std::string键入的所有修复大小的变量.
我的问题:
编译器是 gcc 4.9.3