我在某处读到CString的使用成本很高。你能举个例子说明一下吗?在CString和char数组中,哪个在内存方面更好。
发布于 2013-04-04 19:07:07
除了字符(或宽字符)数组之外,CString还包含字符串大小、分配的缓冲区大小和引用计数器(另外用作锁定标志)。包含字符数组的缓冲区可能比它包含的字符串大得多--它允许减少耗时的分配调用的数量。此外,当CString设置为零大小时,它仍然包含两个wchar字符。
当然,当您将CString的大小与相应的C样式数组的大小进行比较时,数组会更小。但是,如果您希望尽可能广泛地操作CString允许的字符串,您最终将为字符串大小、缓冲区大小定义自己的变量,有时还会定义refcounter和/或防护标志。实际上,您需要存储字符串大小,以避免每次需要时都调用strlen。如果允许缓冲区大于字符串长度,则需要单独存储缓冲区大小,并避免每次在字符串中添加或减去时调用reallocs。以此类推--您可以牺牲一些小尺寸的增加来换取速度、安全性和功能性的显著提高。
所以,答案取决于你要对字符串做什么。假设您想要一个字符串来存储用于日志记录的类名--有一个C样式的字符串(const和static)就可以了。如果需要字符串来操作和广泛使用它与MFC或ATL相关的类,请使用CString系列类型。如果您需要操作应用程序的“引擎”部分中的字符串,这些部分与其接口隔离,并且可能会转换为其他平台,请使用std::string或编写您自己的字符串类型以满足您的特定需求(当您编写“粘合”代码以放置在接口和引擎之间时,这将非常有用,否则std::string会更好)。
发布于 2013-04-03 14:57:58
CString来自于特定于windows的MFC框架。std::string来自c++标准。它们是用于管理内存中的字符串的库类。string将为您提供跨平台的代码可移植性。
使用原始数组对内存总是有好处的,但是必须对字符串进行操作,使用原始数组变得困难,考虑越界检查,获取字符串长度,复制数组或更改大小,因为字符串可能会增长,删除数组等。string类将实际的字符串保存在堆中,而您有string类本身的开销。然而,这将为您提供管理字符串内存的功能,无论如何,您必须手动编写字符串内存。
如果可以,最好使用std::string,如果不能,则使用CString。
发布于 2013-04-04 20:57:49
在几乎所有情况下,我都鼓励新手程序员使用std::string或CString(*)。首先,他们犯的错误会少得多。由于错误地使用C数组,我见过许多缓冲区溢出、内存无效或内存泄漏。
那么,CString / std::string和原始字符数组哪一个更有效呢?内存方面,一般来说,所有字符串和std::CString的大小都是一个整数。问题是,这有关系吗?
那么,就性能而言,哪个更高效呢?这取决于你用它做什么,以及你是如何使用你的C数组的。但是传递CString或std::string在计算上可能比C数组更有效。C数组的问题是你不能确定谁拥有内存以及它是什么类型(堆/栈/文字)。防御性编程会导致更多的数组副本,你知道,只是为了确保你持有的内存在需要它的整个持续时间内都是有效的。
如果std::string或CString是通过值传递的,为什么它们比C数组更有效?这有点复杂,原因完全不同。对于CString,这很简单,它实现为一个COW (写入时复制)对象。因此,当你有5个对象来自一个CString时,它不会使用比一个更多的内存,直到你开始对一个对象进行更改。std::string有更严格的要求,因此不允许它与其他std::string对象共享内存。但是如果你有一个较新的编译器,std::string应该实现移动语义,因此从函数返回一个字符串只会导致指针的副本,而不是重新分配。
在很少的情况下,原始C数组是好的和实用的想法。
*)如果你已经在用MFC编程,为什么不直接使用CString。
https://stackoverflow.com/questions/15780589
复制相似问题