【问题标题】:Is it possible to construct a wstring without coping its input buffer?是否可以在不复制输入缓冲区的情况下构造字符串?
【发布时间】:2012-04-24 23:39:01
【问题描述】:

在我的程序中创建了许多 std::wstring 对象,

std::wstring mystr(L"test string");

由于输入的 wchar 字符串是字符串常量,如果 mystr 被构造为 mystr.c_str() 等于 L“测试字符串”的地址,它将节省一些堆使用量。这样的wstring可以构造吗?

【问题讨论】:

标签: c++


【解决方案1】:

确实有这方面的有效用例,但 C++ 字符串类完全不支持它。如果你真的需要它,你需要编写自己的支持实习的字符串类。

请注意,其他几种语言本机支持此功能;不幸的是,C++ 字符串类涵盖了一个相当具体的用例(大量修改)而不是一般用例(本质上不可变字符串的大量副本)。

为简化任务,请考虑是否足以在一对 (const) 迭代器周围使用一个瘦包装类,这些迭代器可能只指向静态内存中 wchar_t 缓冲区的开头和结尾。

【讨论】:

  • 你能举出这样一个用例的例子吗?我能想到的要么是一个变量(然后你只需要一个字符串,你可以从任何你需要的地方访问它)或一个常量,然后你可以简单地使用文字!
  • @MrLister 最明显的用例是一个解析器,它保存重复的标识符和关键字的相同副本。另一个用例来自我的领域(基因组分析),您正在处理基因组的大量子字符串(= 几千兆字节)或大量(= 数十亿!)重复或相同的小字符串。但基本上任何使用重复字符串的应用程序都可以从中受益(即使不是很多)。想一想带有“确定”按钮的单一 GUI。
【解决方案2】:

没有。为此,std::basic_string 的实现将需要关于 wchar_t const* 是否来自字符串文字的附加信息,而此信息根本不可用。即使是这样,它也会增加使用该类的成本,即使参数不是wchar_t const*

如果这些字符串在全局范围内,则构建它们的成本只是在启动时。而且如果是局部变量,你可以随时声明static,这样构建它们的成本只会支付一次,而不是每次进入区块。

【讨论】:

    猜你喜欢
    • 2017-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多