据我所知,写时复制不是std::string在C++ 11中实现符合性的可行方法,但最近在讨论中我发现自己无法直接支持该语句.
我是否正确C++ 11不承认基于COW的实现std::string?
如果是这样,这个限制是否在新标准(其中)的某处明确说明了?
或者这个限制是否暗示,因为新要求的综合影响std::string排除了基于COW的实施std::string.在这种情况下,我会对"C++ 11有效禁止基于COW的std::string实现" 的章节和样式推导感兴趣.
我很想知道如何实现std :: string以及它与c字符串的区别?如果标准没有指定任何实现,那么任何带有解释的实现都会很好,它如何满足标准给出的字符串要求?
我读了一些GCC bugreport,那里有人在谈论"vstring".搜索WEB我注意到http://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-html-USERS-4.2/vstring_8h.html.
有人可以详细说明它有用和用于什么?为什么用它代替std :: string?
我们有一个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为代价......),那将是一个加分.
我想知道我是否误解了某些内容:复制构造函数是否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)
它将内容复制到新字符串中.
我刚刚阅读了一篇关于写时复制的维基百科文章(如果有任何支持它的文件系统很好奇),并对以下段落感到惊讶:
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::vector或std::array?哪些编译器支持该优化(特别是,我想知道G ++,英特尔C++编译器和Microsoft C++编译器)?
理想情况下,不可变字符串类只需要为每个字符串分配一次内存。甚至引用计数也可以存储在保存字符串本身的同一块内存中。
string和的简单实现shared_ptr将为 分配三个不同的内存shared_ptr<string const>:
现在,我知道在使用 时std::make_shared(),智能实现可以将后两者合并为一个分配。但这仍然会留下两个分配。
当您知道字符串是不可变的时,字符串缓冲区将不会被重新分配,因此应该可以将其与字符串对象集成,只留下一次分配。
我知道某些字符串实现已经对短字符串使用了此类优化,但我正在寻找一个无论字符串长度如何都可以执行此操作的实现。
我的问题是:我的推理合理吗?实施实际上是否允许并且能够做到这一点?我可以合理地期望一个高质量的标准库来实现这种优化吗?您知道当代图书馆的实现可以做到这一点吗?
或者这是我必须自己实现的事情?
我在某处读到新标准强制在字符串类的实现中移动语义.现在编译器就像gcc一样,在写入时将字符串实现为复制以提高性能,这使得复制和传递字符串作为参数的值非常便宜.现在,如果现在强制复制字符串的移动语义,那么性能是否会失败?因为如果确实传递在范围之间移动它们的字符串会很便宜,那么在复制字符串时,它仍然需要进行复制,对吗?
有人可以为我澄清这个问题吗?
谢谢.
我编写了这个构造函数来初始化字符类型数组
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函数.无论如何要做到这一点?