Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.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
Performance 相对于本机(VC)堆对象的pin_ptr性能_Performance_C++ Cli_Pin Ptr - Fatal编程技术网

Performance 相对于本机(VC)堆对象的pin_ptr性能

Performance 相对于本机(VC)堆对象的pin_ptr性能,performance,c++-cli,pin-ptr,Performance,C++ Cli,Pin Ptr,在C#to native lib CLI/C++包装器中,我有一个选择: 在托管类中存储本机指针(本机对象是使用本机“new”创建的) 或 将本机对象作为数据blob存储在托管类的字段中,并在每次本机使用之前使用pin_ptr将其固定 有没有人对这两条路径的相对性能成本进行过比较分析 谢谢 pin_ptr是为了防止托管堆上的对象在其地址被传递给本机函数时被GC移动,而本机函数不知道椅子可能被GC拉。它不会影响在本机堆或堆栈上分配的内存 在托管类中存储本地对象为BLUB是管理C++对混合类

在C#to native lib CLI/C++包装器中,我有一个选择:

  • 在托管类中存储本机指针(本机对象是使用本机“new”创建的)

  • 将本机对象作为数据blob存储在托管类的字段中,并在每次本机使用之前使用
    pin_ptr
    将其固定
有没有人对这两条路径的相对性能成本进行过比较分析


谢谢

pin_ptr是为了防止托管堆上的对象在其地址被传递给本机函数时被GC移动,而本机函数不知道椅子可能被GC拉。它不会影响在本机堆或堆栈上分配的内存


在托管类中存储本地对象为BLUB是管理C++对混合类型所做的操作。在垃圾收集堆上返回一个指向内存的指针太容易了,该内存没有被固定,可能会在以后使应用程序崩溃,而这个问题很难调试。这个问题非常普遍(人们不希望椅子能被GC拉到),微软决定完全禁用混合类型,因此人们必须明确指定对象的内存位置。

可能没有太大区别。GC分配实际上比本机
new
略快。当GC执行收集时,如果对象被固定,那么固定只是一个性能问题。如果托管对象最终足够大,可以进入LOH,那么固定是免费的

但我自己没量过


我不会使用GCHandle在函数调用之间固定对象。这比设置
pin_ptr
更昂贵,并且更有可能影响GC。对于需要永久保留的数据,请使用本机分配器。

这与返回局部变量的地址基本相同。。。经验丰富的C++程序员并不担心,但来自管理世界的人可能会遇到困难。