问题标签 [unsafe]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1356 浏览

c# - 使用透明混合将小位图复制到大位图:什么比 graphics.DrawImage(smallBitmap, x , y) 更快?

我已将此调用确定为高压功能中的瓶颈。

有没有更快的方法将小的半透明位图混合成更大的半透明位图?

示例用法:

DrawImage 调用采用一个小的 32bppPArgb 位图并将它们复制到一个较大的位图中,这些位图的位置不同,并且小位图可能仅部分重叠较大的位图可见区域。两个图像都有半透明的内容,这些内容由 DrawImage 以对输出很重要的方式混合。我已经使用 BitBlt 进行了一些测试,但没有看到显着的速度改进,并且 alpha 混合在我的测试中并没有出现相同的结果。我对任何方法都持开放态度,包括更好地调用 bitblt 或不安全的 c# 代码。

0 投票
1 回答
736 浏览

c# - C#。如何将消息从不安全回调传递到托管代码?

是否有一个简单的示例说明如何将消息从不安全回调传递到托管代码?

我有一个专有的 dll,它接收一些包装在结构中的消息,所有消息都进入回调函数。

使用示例如下,但它也调用了不安全的代码。我想将消息传递到我的所有托管代码的应用程序中。

*PS 我没有互操作或不安全代码方面的经验。我在 8 年前曾使用 C++ 进行开发,但对那个噩梦般的时代几乎不记得了 :)

PPS 该应用程序加载得非常糟糕,最初的开发人员声称它每秒处理 200 万条消息。我需要一个最有效的解决方案。*

谢谢你。

0 投票
4 回答
8268 浏览

c# - C# 内存管理:不安全的关键字和指针

在C#中使用unsafe关键字来使用指针有什么后果(正面/负面) ?例如,垃圾收集会变成什么,性能增益/损失是什么,与其他语言手动内存管理相比,性能增益/损失是什么,有什么危险,在什么情况下使用这种语言是真正合理的功能,编译时间更长吗...?

0 投票
1 回答
2334 浏览

c# - AccessViolationException,试图读取或写入受保护的内存

我正在使用一个包含用于与特定硬件交互的非托管代码的 dll,并且我正在尝试从 C# 中使用它,但我不断收到 AccessViolationException。

是什么原因造成的,我该如何解决?

0 投票
4 回答
6644 浏览

c# - 将 C# void* 转换为 byte[]

在 C# 中,我需要将 T[] 写入流,理想情况下不需要任何额外的缓冲区。我有一个动态代码将 T[] (其中 T 是一个无对象结构)转换为 void* 并将其修复在内存中,效果很好。当流是文件时,我可以使用本机 Windows API 直接传递 void *,但现在我需要写入一个接受 byte[] 的通用 Stream 对象。

问题:任何人都可以建议一种黑客方法来创建一个实际上没有任何堆分配的虚拟数组对象,而是指向一个已经存在(和固定)的堆位置?

这是我需要的伪代码:

更新:fixed(void* ptr=&buffer)我在这篇文章中 详细描述了如何做。我总是可以创建一个字节 [],在内存中修复它并从一个指针到另一个指针进行不安全的字节复制,然后将该数组发送到流,但我希望避免不必要的额外分配和复制。

不可能的? 经过进一步思考,byte[] 在堆中有一些元数据,其中包含数组维度和元素类型。简单地将引用(指针)作为 byte[] 传递给 T[] 可能不起作用,因为块的元数据仍然是 T[] 的元数据。而且即使元数据的结构相同,T[] 的长度也会比 byte[] 小很多,因此托管代码对 byte[] 的任何后续访问都会产生错误的结果。

功能要求@Microsoft Connect 请投票支持此请求,希望 MS 会倾听。

0 投票
2 回答
3236 浏览

c# - C# 实现自定义流编写器类

我将如何编写自己的流操纵器类?

基本上,我想要解决的是将对底层流的引用存储在编写器中。例如,当使用 StreamWriter 写入内存流时,执行 Write() 时,会写入底层内存流。

我可以在不使用指针或不安全代码的情况下存储对基础流的引用吗?即使它只是一个我想“写”到的字符串。

实际上,这与流编写器几乎没有关系,我只是想知道如何在类中存储引用。StreamWriter 是我能想到的最好的例子。

0 投票
6 回答
2657 浏览

c# - C# 巨大的 2-dim 数组

我需要在 C# WinForms 中连续声明超过 20000 个项目的方阵。我在 32 位和 64 位操作系统中读到了大约 2GB 的 .Net 对象大小限制。因此,据我了解,唯一的答案是使用不安全的代码或使用 C++ 编译器构建的单独库。

对我来说这个问题是值得的,因为 ushort[20000,20000] 小于 2GB,但实际上我什至无法分配 700MB 的内存。我的限制是 650MB,我不明白为什么 - 我有 32 位 WinXP 和 3GB 内存。我尝试使用 Marshal.AllocHGlobal(700<<20) 但它抛出 OutOfMemoryException,GC.GetTotalMemory 在尝试分配内存之前返回 4.5MB。

我发现只有很多人说使用不安全的代码,但我找不到如何在堆中声明 2-dim 数组(任何堆栈都不能保存如此大量的数据)以及如何使用指针使用它的示例。它是 unsafe{} 括号内的纯 C++ 代码吗?

PS。请不要问为什么我需要这么大的数组......但如果你想 - 我需要分析文本(例如书籍)并找到很多索引。所以答案是 - 单词之间的关系矩阵

编辑:有人可以提供一个使用不安全代码中的指针处理矩阵的小例子。我知道在 32 位下不可能分配更多空间,但我花了很多时间在谷歌上搜索这样的例子,发现什么都没有

0 投票
1 回答
2673 浏览

uikit - 检索 UIImage (MonoTouch) 的像素 alpha 值

此问题与1042830重复,但特定于 MonoTouch。有没有比分配一个 IntPtr 更安全的方法,使用 CGBitmapContext 绘制它,然后在适当的偏移量处读取字节?

0 投票
2 回答
4516 浏览

c# - 在 C# 中创建子数组引用(使用不安全?)

我正在重构我们当前使用的库,我面临以下问题。

我们曾经有以下东西:

由于各种原因,我用一维数组版本替换了这个锯齿状数组版本,连接内部数组。我的问题是:我怎样才能仍然返回对子数组的引用data

我在想不安全和指针的东西可能有用,它可行吗?

0 投票
4 回答
5406 浏览

c# - C# 泛型数组及其上的数学运算

我目前正在参与一个图像量非常大的项目。这些卷必须非常快速地处理(加法、减法、阈值处理等)。此外,大多数卷都非常大,以至于它们无法放入系统的内存中。出于这个原因,我创建了一个抽象体积类 (VoxelVolume),它承载体积和图像数据并重载运算符,以便可以对体积执行常规数学运算。因此,另外两个问题打开了,我将把它们放入 stackoverflow 到另外两个线程中。

这是我的第一个问题。我的卷以只能包含浮点数组数据的方式实现,但大部分包含的数据来自 UInt16 图像源。只有对卷的操作才能创建浮点数组图像。

当我开始实现这样一个卷时,该类如下所示:

但后来我意识到重载运算符或返回值会变得更加复杂。一个例子是:

还添加两个重载运算符会更复杂:

假设我可以克服上述问题,但我有不同类型的包含图像数据的数组。由于我已将卷中的类型固定为浮动,所以没有问题,并且在添加两个图像卷数组的内容时可以执行不安全的操作。我在这里阅读了一些主题并浏览了网络,但没有找到真正好的解释当我想快速添加两个不同类型的数组时该怎么做。不幸的是,不可能对泛型进行所有数学运算,因为 C# 无法计算基础数据类型的大小。当然,可以通过使用 C++/CLR 来解决这个问题,但目前我所做的一切都是在 32 位和 64 位下运行而无需做任何事情。切换到 C++/CLR 在我看来(如果我错了,请纠正我)我' m 绑定到某个平台(32 位),当我让应用程序在另一个平台(64 位)上运行时,我必须编译两个程序集。这是真的?

所以很快问:如何快速添加两个不同类型的两个数组。是不是C#的开发者没有想到这一点。切换到另一种语言(C# -> C++)似乎不是一种选择。

我意识到只需执行此操作

是不可能的和不必要的,尽管如果它可以工作会很好。我正在尝试的解决方案如下:

如果上面的代码不是很正确,请原谅,我没有使用 C# 编辑器编写它。上面显示的这种解决方案是否可行?请随时询问我是否犯了错误或描述了一些不完整的内容。

谢谢你的帮助
马丁