- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在某处读到 CString 的使用成本很高。你能举个例子吗?同样在 CString 和 char 数组中,哪个在内存方面更好。
最佳答案
CString 除了字符数组(或宽字符)还包含字符串大小、分配的缓冲区大小和引用计数器(另外用作锁定标志)。包含字符数组的缓冲区可能比它包含的字符串大得多——它允许减少耗时的分配调用次数。此外,当 CString 设置为零大小时,它仍然包含两个 wchar 字符。
当然,当您将 CString 的大小与相应的 C 风格数组的大小进行比较时,数组会更小。但是,如果您想尽可能广泛地操作字符串,如 CString 所允许的那样,您最终将定义自己的字符串大小、缓冲区大小以及有时引用计数器和/或保护标志的变量。实际上,您需要存储字符串大小以避免每次需要时都调用 strlen。如果允许缓冲区大于字符串长度,则需要单独存储缓冲区大小,并避免在每次添加或减去字符串时调用 reallocs。依此类推——您可以用一些小尺寸的增加来换取速度、安全性和功能的显着增加。
因此,答案取决于您要对字符串执行的操作。假设您想要一个字符串来存储用于记录的类的名称——C 风格的字符串(const 和 static)就可以了。如果您需要一个字符串来操作它并将其广泛用于 MFC 或 ATL 相关类,请使用 CString 系列类型。如果您需要在应用程序的“引擎”部分中操作与其接口(interface)隔离的字符串,并且可能会转换为其他平台,请使用 std::string 或编写您自己的字符串类型以满足您的特定需求(这可以是当您编写“胶水”代码以放置在界面和引擎之间时非常有用,否则 std::string 更可取)。
关于c++ - CString 或 char 数组哪个在内存方面更好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15780589/
给定 CString buffer = ""; Cstring value = "blah"; buffer.Format ("%s %s", value, value.GetBuffer()); 这
我有这个函数可以将事件(每个事件都是一个 cstring)添加到事件数组中: bool vendor::addEvent(const char * event) { if (eventsSiz
我可以在 CString::Format 中使用 CString 吗,如下所示: CString text = _T("text"); CString format; format.Format(_T
我正在 Ubuntu 16.04 上使用 ROS 和 C++ 开展一个小组项目。一切正常,直到两周前我收到此错误突然的消息: In file included from /usr/include/c+
我有一个将 CString 作为参数之一的函数,我查看了代码库,发现很多地方都使用 const CString& 作为参数。 所以我想知道使用 CString 与 const CString& 之间是
我有两个列表和一个名字要查找。如果要查找的名称不在第一个列表中,那么它可能在格式略有不同的第二个列表中。给出了两种格式之间的转换函数。 std::map* convertedNames; BOOL C
我需要为我的对象计算签名(一种哈希)。计算需要许多每个字符的操作,因此为了加快此过程,我的代码对 CString 进行操作,然后将计算的 CString 转换为最终的 NSString。 stub 代
PVS 工作室发现了一个我正在调查的潜在缺陷;警告 V623 http://www.viva64.com/en/d/0240/ 但是,没有足够的解释来理解为什么要制作临时拷贝。如果 CString::
假设我有以下字符串 char array[1000]; 我如何将它转换为 NSString,反之亦然。 谢谢。 最佳答案 Apple 的开发者引用有一个 good article关于这个问题。基本上,
一些简单的代码在我一直使用的 sdk 中开始出现故障,而且它显然已经正常工作了很长时间,事实上我几乎可以肯定我已经编译了部分代码并且他们有工作,但最近失败了。 在调试器中确认值的示例: void So
我正在尝试这样做: #include CHAR Filename; // [sp+26Ch] [bp-110h]@1 char v31; // [sp+36Ch] [bp-10h]@1 int v3
我知道字符数组不同于 cstring,因为在 cstring 中包含后缀\0 标记值。然而,我也明白,在 cstring、字符数组或任何其他类型的数组的情况下,程序中的数组标识符是指向数组的指针。所以
我在将 unsigned char 转换为 CString 以及将转换后的 CString 结果转换为 unsigned char 时遇到问题。 首先,我尝试使用 CString.append();。
我正在使用一个 Windows 应用程序来解析某些二进制文件。应用程序每次在某个位置都会崩溃(读取访问冲突)。 我正在尝试找出崩溃的根本原因。 (f74.fac): Access violation
需要使用下面的 LogMethod() 来记录 buf 的内容问题是LogMethos 只接受“Const CString&” char buf[1024]; strcpy(buf, cErrorMs
假设我有一个文件。我将所有字节读入一个无符号字符缓冲区。从那里我试图在不知道它的长度的情况下读取一个 c 字符串(空终止)。 我尝试了以下方法: char* Stream::ReadCString()
我在使用数组时遇到问题。我收到以下错误 In function ‘int main(int, const char**)’: 75: error: cannot convert ‘char*’ to
我一直在尝试执行从包含十六进制字符串的 CString 到字节数组的转换,并且一直在 至今未成功。我查看了论坛,到目前为止似乎都没有帮助。有没有一个功能只有几个 执行此转换的代码行数? 我的代码: B
我有两个 CString s1 和 CString s2。我需要在 s1 中找到最后一个条目 s2。我可以在 CString 中找到任何方法,就像在 C# LastIndexOf 中一样。我在 C++
我想将丰富的编辑控件中的整个文本作为 CString 获取,例如 GetDlgItemText,但这是针对对话框的。我能从我的研究中找到的最接近的东西是: GetTextRange并使用 GetTex
我是一名优秀的程序员,十分优秀!