Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++builder 最有效地将std:wstring分配给VCL_C++builder - Fatal编程技术网

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函数可以用来使用wstring
    length()
    作为输入,以避免每次都要计算字符数?因此,
    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
    这样的东西不会这样做,它们只会像在绘画过程中一样使用
    标题。