C++builder 最有效地将std:wstring分配给VCL
我有一系列的C++builder 最有效地将std:wstring分配给VCL,c++builder,C++builder,我有一系列的std::wstring对象需要显示,因此存储在各种VCL对象中 我在文档中查找了VCL字符串Assign()函数,最好是将计数作为输入但找不到的函数 我现在做的是: my_vcl_object->Caption = my_wstring_text.c_str() ; 从文档中可以看到,VCL字符串运算符=()将引用到字符串作为输入 这是否意味着目前: 在构造过程中使用wchar\u t指针创建(temp)VCL字符串对象 因此,所有字符都被计数到NULL字符 接下来,标题字
std::wstring
对象需要显示,因此存储在各种VCL对象中
我在文档中查找了VCL字符串
Assign()
函数,最好是将计数
作为输入但找不到的函数
我现在做的是:
my_vcl_object->Caption = my_wstring_text.c_str() ;
从文档中可以看到,VCL字符串运算符=()
将引用到字符串作为输入
这是否意味着目前:
在构造过程中使用wchar\u t
指针创建(temp)VCL字符串对象
因此,所有字符都被计数到NULL
字符
接下来,标题
字符串
复制临时文件的内容<代码>字符串
或者是否有一个未记录的运算符=()
用于字符串,它采用wchar\t
指针,从而避免了步骤1
第二步呢。是否有一个VCL函数可以用来使用wstringlength()
作为输入,以避免每次都要计算字符数?因此,Caption
可以简单地从本质上复制内存。标题是一个字符串
,它在C++Builder 2007及更早版本中映射到解析
,在C++Builder 2009及更高版本中映射到解构
=
赋值运算符将整个字符串作为输入。是的,你的三点分析是正确的。在您的示例中,一个temp字符串将从中构造和复制
但是,AnsiString
和UnicodeString
都有一个接受两个参数作为输入的构造函数,一个指向字符数据的指针和一个长度,因此您可以使用多个参数显式构造temp字符串,例如:
my_vcl_object->Caption=String(my_wstring_text.c_str(),my_wstring_text.length());
标题是一个字符串
,它在C++Builder 2007及更早版本中映射到解析
,在C++Builder 2009及更高版本中映射到解构
=
赋值运算符将整个字符串作为输入。是的,你的三点分析是正确的。在您的示例中,一个temp字符串将从中构造和复制
但是,AnsiString
和UnicodeString
都有一个接受两个参数作为输入的构造函数,一个指向字符数据的指针和一个长度,因此您可以使用多个参数显式构造temp字符串,例如:
my_vcl_object->Caption=String(my_wstring_text.c_str(),my_wstring_text.length());
谢谢雷米。避免了一步。这不是在VCL中错过的机会吗?可以避免整个内存分配/内存复制。无论如何,谢谢!“可以避免整个内存分配/内存复制”-不,不是避免,只是优化了。代码仍然必须复制wstring
数据,它不必浪费时间来计算长度,因为它已经提前知道了。如果他们提供了一个写时拷贝UnicodeString
实现,而该实现最初可能指向用户定义的内存块,而不是内部分配的块,那么他们就错过了一个真正的机会。但这永远不会发生,因为它与Delphi不兼容。`代码仍然必须复制wstring数据'-对。但这不是两次吗?首先构造临时字符串
,然后在将临时字符串内容复制到可视对象的标题
字符串时?@Peter No,因为字符串
是引用计数的。创建临时字符串
时,只复制一份。然后标题
将在赋值时增加字符串
数据的refcount,然后temp将在销毁时减少refcount。现在,当然,当新的标题
被分配到操作系统层的底层UI控件时,可能会在内部创建另一个副本,但这是一个实现细节。像TLabel
这样的东西不会这样做,他们只会在绘画时使用标题
。谢谢雷米。避免了一步。这不是在VCL中错过的机会吗?可以避免整个内存分配/内存复制。无论如何,谢谢!“可以避免整个内存分配/内存复制”-不,不是避免,只是优化了。代码仍然必须复制wstring
数据,它不必浪费时间来计算长度,因为它已经提前知道了。如果他们提供了一个写时拷贝UnicodeString
实现,而该实现最初可能指向用户定义的内存块,而不是内部分配的块,那么他们就错过了一个真正的机会。但这永远不会发生,因为它与Delphi不兼容。`代码仍然必须复制wstring数据'-对。但这不是两次吗?首先构造临时字符串
,然后在将临时字符串内容复制到可视对象的标题
字符串时?@Peter No,因为字符串
是引用计数的。创建临时字符串
时,只复制一份。然后标题
将在赋值时增加字符串
数据的refcount,然后temp将在销毁时减少refcount。现在,当然,当新的标题
被分配到操作系统层的底层UI控件时,可能会在内部创建另一个副本,但这是一个实现细节。像TLabel
这样的东西不会这样做,它们只会像在绘画过程中一样使用标题。