相关疑难解决方法(0)

C++ 11中COW std :: string实现的合法性

据我所知,写时复制不是std::string在C++ 11中实现符合性的可行方法,但最近在讨论中我发现自己无法直接支持该语句.

我是否正确C++ 11不承认基于COW的实现std::string

如果是这样,这个限制是否在新标准(其中)的某处明确说明了?

或者这个限制是否暗示,因为新要求的综合影响std::string排除了基于COW的实施std::string.在这种情况下,我会对"C++ 11有效禁止基于COW的std::string实现" 的章节和样式推导感兴趣.

c++ string stdstring copy-on-write c++11

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

如何实现std :: string?

我很想知道如何实现std :: string以及它与c字符串的区别?如果标准没有指定任何实现,那么任何带有解释的实现都会很好,它如何满足标准给出的字符串要求?

c++ string std cstring

53
推荐指数
4
解决办法
5万
查看次数

什么是GCC的"vstring"?

我读了一些GCC bugreport,那里有人在谈论"vstring".搜索WEB我注意到http://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-html-USERS-4.2/vstring_8h.html.

有人可以详细说明它有用和用于什么?为什么用它代替std :: string?

c++ gcc

22
推荐指数
1
解决办法
7035
查看次数

在C++中使用哪些字符串类?

我们有一个C++(MFC)的多线程桌面应用程序.目前开发人员使用CString或std :: string,可能取决于他们的心情.所以我们想选择一个实现(可能不是那两个).

MFC的CString基于写时复制(COW)习惯,有些人会声称这在多线程环境中是不可接受的(并且可能参考了这篇文章).我不相信这样的说法,因为原子计数器看起来非常快,并且这种开销在某种程度上可以通过减少内存重新分配来弥补.

我了解到std :: string实现依赖于编译器 - 它在MSVC中不是COW,但它是,或者是在gcc中.据我所知,新的C++ 0x标准将通过要求非COW实现并解决一些其他问题(例如连续的缓冲区要求)来解决这个问题.所以实际上std :: string看起来没有明确定义......

我不喜欢std :: string的一个简单示例:没有办法从函数返回一个字符串而没有过多的重新分配(复制构造函数如果按值返回,并且没有访问内部缓冲区来优化那么"返回通过引用"例如std::string& Result没有帮助".我可以使用CString执行此操作,方法是返回值(由于COW没有复制)或通过引用传递并直接访问缓冲区.再次,C++ 0x使用其右值引用进行救援,但我们不会在最近的特征中使用C++ 0x.

我们应该使用哪个字符串类?COW真的可以成为一个问题吗?是否有其他常用的字符串高效实现?谢谢.

编辑:我们目前不使用unicode,我们不太可能需要它.但是,如果有一些容易支持unicode的东西(不是以ICU为代价......),那将是一个加分.

c++ string multithreading copy-on-write

17
推荐指数
2
解决办法
2661
查看次数

std :: string copy构造函数不在GCC 4.1.2中?

我想知道我是否误解了某些内容:复制构造函数是否std::string 复制其内容?

string str1 = "Hello World";
string str2(str1);

if(str1.c_str() == str2.c_str()) // Same pointers!
  printf ("You will get into the IPC hell very soon!!");
Run Code Online (Sandbox Code Playgroud)

这将打印出"你很快就会进入IPC地狱!" 它让我烦恼

这是正常的行为std::string吗?我在某处读到它通常会做一个深层复制.

但是,这可以按预期工作:

string str3(str1.c_str());

if(str1.c_str() == str3.c_str()) // Different pointers!
  printf ("You will get into the IPC hell very soon!!");
else
  printf ("You are safe! This time!");
Run Code Online (Sandbox Code Playgroud)

它将内容复制到新字符串中.

c++ gcc deep-copy stdstring copy-constructor

13
推荐指数
2
解决办法
3276
查看次数

STL中的写时复制支持

我刚刚阅读了一篇关于写时复制的维基百科文章(如果有任何支持它的文件系统很好奇),并对以下段落感到惊讶:

COW也在内核之外,库,应用程序和系统代码中使用.例如,C++标准库提供的字符串类是专门为允许写时复制实现而设计的:

std::string x("Hello");

std::string y = x;  // x and y use the same buffer

y += ", World!";    // now y uses a different buffer
                    // x still uses the same old buffer
Run Code Online (Sandbox Code Playgroud)

我不知道STL中是否支持copy-on-write.真的吗?它是否适用于其他STL类,例如std::vectorstd::array?哪些编译器支持该优化(特别是,我想知道G ++,英特尔C++编译器和Microsoft C++编译器)?

c++ compiler-construction stl copy-on-write

9
推荐指数
1
解决办法
5943
查看次数

std::shared_ptr<std::string const> 可以作为引用计数不可变字符串的有效实现吗?

理想情况下,不可变字符串类只需要为每个字符串分配一次内存。甚至引用计数也可以存储在保存字符串本身的同一块内存中。

string和的简单实现shared_ptr将为 分配三个不同的内存shared_ptr<string const>

  • 字符串缓冲区的内存
  • 字符串对象的内存
  • 引用计数的内存

现在,我知道在使用 时std::make_shared(),智能实现可以将后两者合并为一个分配。但这仍然会留下两个分配。

当您知道字符串是不可变的时,字符串缓冲区将不会被重新分配,因此应该可以将其与字符串对象集成,只留下一次分配。

我知道某些字符串实现已经对短字符串使用了此类优化,但我正在寻找一个无论字符串长度如何都可以执行此操作的实现。

我的问题是:我的推理合理吗?实施实际上是否允许并且能够做到这一点?我可以合理地期望一个高质量的标准库来实现这种优化吗?您知道当代图书馆的实现可以做到这一点吗?

或者这是我必须自己实现的事情?

c++ string std immutability

5
推荐指数
1
解决办法
5178
查看次数

移动语义和字符串性能

我在某处读到新标准强制在字符串类的实现中移动语义.现在编译器就像gcc一样,在写入时将字符串实现为复制以提高性能,这使得复制和传递字符串作为参数的值非常便宜.现在,如果现在强制复制字符串的移动语义,那么性能是否会失败?因为如果确实传递在范围之间移动它们的字符串会很便宜,那么在复制字符串时,它仍然需要进行复制,对吗?

有人可以为我澄清这个问题吗?

谢谢.

c++

4
推荐指数
1
解决办法
202
查看次数

c ++中的char初始化构造函数

我编写了这个构造函数来初始化字符类型数组

class StudentInfo
{
  char* vuId;
public:
  StudentInfo(char* vu_Id)
  {
    setVuId(vu_Id);
  }
  void setVuId(char* vu_Id)
  {
    vuId = new char[strlen(vu_Id) + 1];
    strcpy(vuId, vu_Id);
  }
};
Run Code Online (Sandbox Code Playgroud)

这段代码工作正常.但我想初始化而不必调用setVuId函数.无论如何要做到这一点?

c++ constructor

-1
推荐指数
1
解决办法
1465
查看次数