我将pin_ptr用于cli :: array类型,一切正常。
是否可以对System :: Collection :: Generic :: List执行相同的操作,我认为这是一个连续的内存块?
显而易见的
List<double>^ stuff = gcnew List<double>( 10 );
cli::pin_ptr<double> resultPtr = &stuff[ 0 ];
给出了编译错误&#34;错误C2102:&#39;&amp;&#39;需要l值&#34;大概是因为索引属性返回的东西不是l值!那么有另一种方法可以做到这一点。我也玩过interior_ptr,但还没找到任何可行的东西。
我知道我可以在列表上调用ToArray,但重点是不要复制内容。
答案 0 :(得分:2)
不,这是不可能的。
确实,List在幕后使用数组,但[]
运算符不同。对于数组,[]
是简单的指针数学,但对于List,[]
是一个完整的方法调用。这就是&
不起作用的原因:您可以获取数组位置的地址,但不能获取方法返回的值的地址。
这样想:如果他们愿意,他们可以在不改变外部接口的情况下改变List
的实现。可以更改List以将列表内容存储在内存gzip-compressed中。在这种情况下,执行解压缩的stuff[0]
方法即时生成[]
,因此没有单个内存位置包含stuff[0]
来固定。
是,是List类的内部,内容在内存中是连续的。您可以在Microsoft提供的source中看到此信息。但是,List类不会使该数组公开:List类的公共接口是公共方法&amp;只有属性。公共方法&amp;属性表示合同,值存储的数组不是该合同的一部分。微软永远不会这样做,但他们可以做一个gzip压缩的List实现,而List类的公共契约不会改变。您应该只将代码写入公共方法&amp;类的属性,而不是可能随时改变的内部属性。