2012-04-12 55 views
0

有性病的许多对象::在我的计划WSTRING创建为,是否有可能构建一个wstring而不应用其输入缓冲区?

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

由于输入字符串WCHAR是字符串常量,它会节省一些堆的使用情况,如果myStr的构造为mystr.c_str()等于到L“测试串”的地址。是否有可能构建这样的wstring?

+0

不,每个字符串总是有自己的缓冲区。但是,为什么你需要多个字符串,如果它们都具有相同的值? – 2012-04-12 15:32:16

+0

可能的重复http://stackoverflow.com/questions/783944/how-do-i-allocate-a-stdstring-on-the-stack-using-glibcs​​-string-implementation – 2012-04-12 15:33:38

+0

有些编译器已经跳过堆分配这个简短。 [字符串类为堆栈分配小字符串](http://stackoverflow.com/questions/5419016/string-class-allocating-on-stack-for-small-strings) – 2012-04-12 16:25:57

回答

1

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

请注意,其他几种语言本身支持这种; C++字符串类不幸地覆盖了一个相当特殊的用例(大量的修改),而不是一般的(大量基本上不可变的字符串的副本)。

为了简化任务,考虑是否足够让您在一对(const)迭代器周围使用一个薄包装类,它可以指向静态内存中的wchar_t缓冲区的开始和结束。

+0

你能举出这样一个用例的例子吗?我所能想到的只是一个变量(然后你只需要一个字符串,你可以从任何你需要的地方访问它)或者一个常量,然后你可以简单地使用字面值! – 2012-04-12 15:38:23

+1

@MrLister最明显的用例是一个解析器,它保留了定期标识符和关键字的相同副本。另一个用例来自我的领域(基因组分析),您正在处理大量的重复或相同的小字符串的基因组子串(=几千兆字节)或很多(=十亿!)。但基本上任何使用重复字符串的应用程序都可以从中获益(即使不是很多)。用“OK”按钮来想象单个GUI。 – 2012-04-12 15:42:05

1

否。为了做到这一点,std::basic_string的实施将需要额外的信息,以确定wchar_t const*是否来自字符串文字,并且此信息根本不可用。即使是这样,即使参数不是wchar_t const*,也会增加使用该类的成本。

如果这些字符串在全局范围内,构建它们的开销只在启动时进行。如果它们是局部变量,则可以始终声明它们为static,因此构建它们的成本只支付一次,而不是每次输入块时。

相关问题