Visual c++ CString移动优化类似于std::string

Visual c++ CString移动优化类似于std::string,visual-c++,mfc,c-strings,Visual C++,Mfc,C Strings,是否有一种技术可以将CString的内部缓冲区移动到另一个CString中,从而避免深度复制 我有一个输出CString,它是解析InputString的结果,我想交换两个字符串的缓冲区 void ProcessString(CString& strInputString) { CString strOutputString //... strInputString = strOutputString; // how to avoid a deep copy } 这个问题是基于分析,还

是否有一种技术可以将CString的内部缓冲区移动到另一个CString中,从而避免深度复制

我有一个输出CString,它是解析InputString的结果,我想交换两个字符串的缓冲区

void ProcessString(CString& strInputString)
{
CString strOutputString
//...
strInputString = strOutputString; // how to avoid a deep copy
}

这个问题是基于分析,还是仅仅假设存在深层拷贝?我相信
CString
实现了写时复制语义,因此
strInputString=strOutputString
仅增加
strOutputString
上的引用计数,而不复制任何数据。还有几个问题:您是否发现了性能问题,或者这只是过早的、基于猜测的优化?您是否考虑过返回
CString
,并自动受益于RVO的自然实现?为什么
strInputString
是一个输入/输出参数?@IInspectable我假设有一个深度副本,我可以检查汇编代码以确定它。。。我需要优化strInputString的过程,因为它是一个用户请求(关键字),我希望避免ProcessString占用太多时间,因为我的应用程序被许多用户使用。我只需要在strInputString中的一些字符前面加一个反斜杠,这就是为什么我需要一个临时字符串来完成这项工作。最好是交换两个字符串(输入和输出)的缓冲区,而不是复制,这对STL字符串是可行的,我不知道这与良好的旧CString是相同的情况。您分析了代码吗?听起来不像。您正在尝试优化某些东西,您不知道它是否是瓶颈,如果是瓶颈,您将不知道您的更改是提高了性能还是降低了性能。或者没有任何效果。你需要先设定个人资料。这样一来,无论是
std::string
还是
CString
都不支持在不复制的情况下预加字符。该操作的复杂性是O(n)。注意:查看程序集并不能告诉您任何有关性能的信息。一个剖析器会。既然您可以使用MFC的完整源代码,为什么还要看汇编呢?在这种情况下,没有深度复制。“不可检测”是对的。CString具有写时复制语义。您的代码可能只释放strInputString的旧内容,而不是增加strOutputString的使用计数。仅当strOutputString或strInputString在以后更改时,才会分配新的缓冲区。此问题是基于分析,还是仅假设存在深度副本?我相信
CString
实现了写时复制语义,因此
strInputString=strOutputString
仅增加
strOutputString
上的引用计数,而不复制任何数据。还有几个问题:您是否发现了性能问题,或者这只是过早的、基于猜测的优化?您是否考虑过返回
CString
,并自动受益于RVO的自然实现?为什么
strInputString
是一个输入/输出参数?@IInspectable我假设有一个深度副本,我可以检查汇编代码以确定它。。。我需要优化strInputString的过程,因为它是一个用户请求(关键字),我希望避免ProcessString占用太多时间,因为我的应用程序被许多用户使用。我只需要在strInputString中的一些字符前面加一个反斜杠,这就是为什么我需要一个临时字符串来完成这项工作。最好是交换两个字符串(输入和输出)的缓冲区,而不是复制,这对STL字符串是可行的,我不知道这与良好的旧CString是相同的情况。您分析了代码吗?听起来不像。您正在尝试优化某些东西,您不知道它是否是瓶颈,如果是瓶颈,您将不知道您的更改是提高了性能还是降低了性能。或者没有任何效果。你需要先设定个人资料。这样一来,无论是
std::string
还是
CString
都不支持在不复制的情况下预加字符。该操作的复杂性是O(n)。注意:查看程序集并不能告诉您任何有关性能的信息。一个剖析器会。既然您可以使用MFC的完整源代码,为什么还要看汇编呢?在这种情况下,没有深度复制。“不可检测”是对的。CString具有写时复制语义。您的代码可能只释放strInputString的旧内容,而不是增加strOutputString的使用计数。仅当strOutputString或strInputString在以后更改时,才会分配新的缓冲区。