C++ 以最快和/或最安全的方式在c++;?

C++ 以最快和/或最安全的方式在c++;?,c++,string,concatenation,concat,string-concatenation,C++,String,Concatenation,Concat,String Concatenation,下列宽字符串连接方法之一是否比另一种更快和/或更安全 1) std::wstring LPCWSTR str1 = L"string 1,"; LPCWSTR str2 = L"string 2"; std::wstring stdResult = std::wstring(str1) + str2; LPCWSTR result = stdResult.c_str(); 2) wcscpy_s,wcscat_s WCHAR buf[128]; LPCWSTR str1 = L"strin

下列宽字符串连接方法之一是否比另一种更快和/或更安全

1) std::wstring

LPCWSTR str1 = L"string 1,";
LPCWSTR str2 = L"string 2";

std::wstring stdResult = std::wstring(str1) + str2;
LPCWSTR result = stdResult.c_str();
2) wcscpy_s,wcscat_s

WCHAR buf[128];

LPCWSTR str1 = L"string 1,";
LPCWSTR str2 = L"string 2";

wcscpy_s(buf, str1);
wcscat_s(buf, str2);
LPCWSTR result = buf;
3) _snwprintf_s

WCHAR buf[128];

LPCWSTR str1 = L"string 1,";
LPCWSTR str2 = L"string 2";

_snwprintf_s(buf, _TRUNCATE, L"%s%s", str1, str2);
LPCWSTR result = buf;
还是有更快/更安全的方法

其中,在以下方面,最佳选择是什么:

  • 速度
  • 保安

    • 这些例子不恰当。 例如,在您的
      wcscat
      变体中,没有额外的内存分配,因此它是最快的

      std::wstring
      上执行
      +=
      时,速度主要取决于
      std::wstring
      是否必须重新分配

      因此,您的问题归结为内存分配问题。如果已经分配了内存,则
      wstring
      的运行速度应与您需要的速度一样快


      另一个问题是其他人已经注意到的,你想要合理的速度和最大的安全性。如果您计划进行太多的连接,并且您的分析器显示出显著的速度问题,那么您可以实现自己的分配器

      这些例子不合适。 例如,在您的
      wcscat
      变体中,没有额外的内存分配,因此它是最快的

      std::wstring
      上执行
      +=
      时,速度主要取决于
      std::wstring
      是否必须重新分配

      因此,您的问题归结为内存分配问题。如果已经分配了内存,则
      wstring
      的运行速度应与您需要的速度一样快



      另一个问题是其他人已经注意到的,你想要合理的速度和最大的安全性。如果您计划进行太多的连接,并且您的分析器显示出显著的速度问题,那么您可以实现自己的分配器

      尽可能使用
      std::wstring
      ,因为它负责缓冲区分配和释放。如果您使用的是非常糟糕的用户数据,选项2和3可能会溢出。唯一确定的方法是对其进行分析。如果内存到处泄漏或存在大量缓冲区溢出错误,速度并不重要。话虽如此,正如内森暗示的那样,请描述一下。在最极端的条件下进行测试,以了解更多有关性能特征的信息。速度可能是“重要的”,但这并不意味着您需要绝对最快的解决方案,您只需要速度可以接受的东西,而且
      wstring
      擅长于它的功能。更快的解决方案可能对UTF一无所知,并可能导致各种问题。。。。当然,您需要分析最终代码。如果始终坚持使用
      wstring
      ,则可能根本不需要在
      LPCWSTR
      wstring
      之间来回切换;您还可以享受移动语义和更安全的内存管理的好处。例如,请注意,
      LPCWSTR result=stdResult.c_str()stdResult
      随后被操纵或超出范围,code>可能很容易导致UB。这取决于您在做什么以及如何使用结果字符串。版本2和3是快速的,因为它们不在堆上分配。也可以创建C++类,它将与没有堆版本一样快,并且将比C版本更灵活。只要有可能使用“代码> STD::WScGe< /Cord>”,因为它负责缓冲区分配和释放。如果您使用的是非常糟糕的用户数据,选项2和3可能会溢出。唯一确定的方法是对其进行分析。如果内存到处泄漏或存在大量缓冲区溢出错误,速度并不重要。话虽如此,正如内森暗示的那样,请描述一下。在最极端的条件下进行测试,以了解更多有关性能特征的信息。速度可能是“重要的”,但这并不意味着您需要绝对最快的解决方案,您只需要速度可以接受的东西,而且
      wstring
      擅长于它的功能。更快的解决方案可能对UTF一无所知,并可能导致各种问题。。。。当然,您需要分析最终代码。如果始终坚持使用
      wstring
      ,则可能根本不需要在
      LPCWSTR
      wstring
      之间来回切换;您还可以享受移动语义和更安全的内存管理的好处。例如,请注意,
      LPCWSTR result=stdResult.c_str()stdResult
      随后被操纵或超出范围,code>可能很容易导致UB。这取决于您在做什么以及如何使用结果字符串。版本2和3是快速的,因为它们不在堆上分配。也可以创建C++类,它将与没有堆版本一样快,并且将比C版本更灵活。<代码> STD::WScGe> 有“代码>保留< /代码>,这样你就可以处理重新分配的风险。是的,我试图告诉他,他的问题是内存分配问题,不是复制速度。并且
      wstring
      保持
      长度
      ,与
      wcscat
      的速度相比可能是一个优势。我的应用程序当前使用方法3,我不知道是否值得将其替换为1或2。我不知道std::wstring是否值得(潜在)速度损失,因为由于字符串的来源,缓冲区不可能溢出,我的应用程序正在处理音频数据,每毫秒都值黄金。@SinOfficial我是一名专业音频开发人员,我从来没有遇到过STL问题,使用具有超低延迟和VST的ASIO缓冲区。你可以应付std::wstring,现在PC音频的速度太高了。即使这意味着从32个频道录制。
      std::wstring
      具有
      保留
      ,因此您可以规避重新分配的风险。是的,我试图告诉他,他的问题是内存分配问题,而不是复制速度。并且
      wstring
      保持
      长度,与spe相比,使用可能是一种优势