【发布时间】:2013-03-12 08:24:46
【问题描述】:
在深入探讨问题本身之前,请理解,我无法控制这里的整个食物链 - “你做错了”类型的答案或 cmet 无济于事,因为我需要针对给定的 API。
传递原始数据块的组件通常通过byte[] 或ArraySegment<byte> 类型的缓冲区进行。后者的一大优势是能够一次性分配一个大缓冲区,然后通过 ArraySegment 机制使用部分缓冲区来减少内存分配、碎片和 GC 问题。这里没有什么新鲜事。
这是有代价的:使用ArraySegment<byte> 的(可能是外来的、封闭源代码的)组件获得对完整数组的引用(并因此获得访问权),这意味着,如果它行为不端,它就有能力破坏完全不相关的缓冲区。
现在:
- 广泛的搜索显示没有任何机制可以将现有数组的一部分仅公开为完整数组,this SO question 是我得到的最接近的数组,但仍然无法使用,因为它“不是数组” .
- 不支持从
System.Array继承。 - 也不支持从
System.ArraySegment<T>继承。
我的问题链是(回答一个过时的问题):
- 是否有一种“棘手”的方式将自行开发的包装器以
byte[]的形式呈现给(外国)消费者 - 或者是否有一种“棘手”的方式将自行开发的包装器作为
ArraySegment<byte>呈现给(外国)消费者,这不会暴露完整的底层数组 - 或者,有没有办法从
System.Array继承,我错过了 - 再次交替:有没有办法从我错过的已分配(和固定)内存区域创建
byte[],如果它被 GCed 不会搞砸
编辑:
从我的评论来看,我没有表达足够的表达。来回复制数据不是解决方案。不过是我现在用的拐杖。
【问题讨论】:
-
我认为,复制任何数据都不是解决方案?
-
@DanielHilgarth 这就是我现在所做的,不,不是。性能影响很大(如果不是瘫痪的话)
-
@DanielHilgarth 我非常不愿意离开托管世界(即真正本地化),但不安全的代码是可以的。
-
我同时删除了那条评论,因为我不确定这会有什么帮助。
-
第三方代码实际期望的类型是什么?
byte[]或ArraySegment<byte>?