CString或char数组哪个在内存方面更好

时间:2013-04-03 06:46:10

标签: c++ memory char cstring

我在某处读过CString的使用成本很高。你能用一个例子来校对吗?在CString和char数组中也是如此,这在内存方面更好。

3 个答案:

答案 0 :(得分:1)

CString除了字符数组(或宽字符)外还包含字符串大小,分配的缓冲区大小和引用计数器(另外作为锁定标志)。包含字符数组的缓冲区可能比它包含的字符串大得多 - 它允许减少耗时的分配调用次数。此外,当CString设置为零大小时,它仍然包含两个wchar字符。

当然,当你将CString的大小与相应的C风格数组的大小进行比较时,数组会更小。但是,如果要像CString允许的那样广泛地操作字符串,最终将为字符串大小,缓冲区大小以及有时refcounter和/或guard标志定义自己的变量。实际上,您需要存储字符串大小以避免每次需要时调用strlen。如果允许缓冲区大于字符串长度,则需要单独存储缓冲区大小,并避免每次添加或删除字符串时调用reallocs。等等 - 您交易一些小规模的增加,以显着提高速度,安全性和功能性。

所以,答案取决于你要对字符串做什么。假设您想要一个字符串来存储您的类的名称以进行日志记录 - 那么C样式的字符串(const和static)就可以了。如果需要一个字符串来操作并广泛使用它与MFC或ATL相关的类,请使用CString族类型。如果您需要在应用程序的“引擎”部分中操作与其接口隔离的字符串,并且可能转换为其他平台,请使用std :: string或编写您自己的字符串类型以满足您的特定需求(这可以是当您在接口和引擎之间编写“粘合”代码时非常有用,否则最好使用std :: string)。

答案 1 :(得分:0)

CString来自特定于Windows的MFC框架。 std :: string来自c ++标准。它们是用于管理内存中字符串的库类。 std :: string将为您提供跨平台的代码可移植性。

使用原始数组总是对内存有好处,但是必须对字符串进行操作并且使用原始数组变得困难,考虑越界检查,获取字符串长度,复制数组或更改大小,因为字符串可能会增长,删除数组等。对于所有这些问题,字符串实用程序类是很好的包装器。字符串类将实际的字符串保留在堆中,并且您拥有字符串类本身的开销。但是,这将为您提供管理字符串内存的功能,无论如何您必须手动编写。

如果可以的话,首选std :: string,使用CString。

答案 2 :(得分:0)

在几乎所有情况下,我都鼓励新手程序员使用std :: string或CString(*)。首先,他们将减少错误。由于错误使用C数组,我看到很多缓冲区溢出,内存失效或内存泄漏。

哪个更高效,CString / std :: string或原始字符数组?内存方面,一般来说,所有CString和std :: string都有一个大小的整数。问题是重要吗?

那么在性能方面哪个更有效?那么这取决于你正在做什么以及你如何使用你的C阵列。但是传递CString或std :: string arround在计算上可能比C数组更有效。 C阵列的问题在于你不能确定谁拥有内存以及它是什么类型(堆/堆栈/文字)。你知道,防御性编程会产生更多的数组副本,只是为了确保你所拥有的内存在整个需要的时间内都有效。

为什么std :: string或CString比C-arrays更有效,如果它们按值传递?这有点复杂,原因完全不同。对于CString,这很简单,它实现为COW(写入时复制)对象。因此,当您有5个对象来自一个CString时,它将不会使用更多的内存,直到您开始对一个对象进行更改。 std :: string具有更严格的要求,因此不允许与其他std :: string对象共享内存。但是如果你有一个更新的编译器,std :: string应该实现移动语义,因此从函数返回一个字符串只会导致指针的副本不重新分配。

极少数情况下,原始C阵列是好的和实用的想法。

*)如果您已经针对MFC编程,为什么不使用CString。