相关疑难解决方法(0)

在std :: string的上下文中首字母缩略词SSO的含义

关于优化和代码风格的C++问题中,在优化副本的上下文中,有几个答案提到了"SSO" std::string.在这种情况下,SSO意味着什么?

显然不是"单点登录"."共享字符串优化",或许?

c++ string optimization

141
推荐指数
3
解决办法
2万
查看次数

是否在GCC 4.x/C++ 11中重新计算了std :: string?

std::string使用gcc 4时引用计数-std=c++0x-std=c++11

c++ gcc stdstring c++11

34
推荐指数
3
解决办法
1万
查看次数

如何用vstring替换std :: string?

我最近了解到,自几年以来,libstdc ++库包含vstring(也称为versa_string),它提供了相同的功能std::string,但显然更符合C++标准.我曾试图用它vstring作为替代品std::string,但我发现没有简单的方法可以做到.

有没有一种简单的方法来代替std::stringvstring,在不改变的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)

c++ string libstdc++ c++11

7
推荐指数
1
解决办法
1329
查看次数

g ++是否满足std :: string C++ 11的要求

请考虑以下示例:

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 …

c++ string g++ std c++11

5
推荐指数
2
解决办法
2721
查看次数

在不复制的情况下为字符串使用外部缓冲区

假设我有一个函数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++ string c++11 string-view

3
推荐指数
1
解决办法
1274
查看次数

STL内存管理对于长期运行的程序是"可靠的"吗?

我在C++ 11 STL中阅读了很多关于内存管理的帖子,但我找不到令人满意的答案.

我的情况:我开发了一个长期运行的服务器[它运行大约4-6周].目前我使用了很多旧的 C代码char [x][y]char [z]位于堆栈上的变量.

怀疑 STL内存管理是否仍然可靠,在一个运行数周的程序中广泛使用它,并在此期间服务超过1000万个线程,每个线程将有很多STL操作.

更具体一点:我想重写位于堆栈std::vector<std::string>std::string键入的所有修复大小的变量.

我的问题:

  1. 我可以完全安全地将我的程序重写为新的现代STL表示法并摆脱旧的C代码吗?
  2. 在数百万个线程中长时间运行时是否存在任何内存碎片
  3. 性能如何?使用堆栈上具有变量的旧C代码不会对性能产生任何影响.

编译器是 gcc 4.9.3

c++ memory-management stl c++11

2
推荐指数
1
解决办法
703
查看次数