问题标签 [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 投票
5 回答
2669 浏览

c# - 将指针数组固定在内存中

我目前正在将 C# 中的光线追踪器作为一个爱好项目。我试图通过从 c++ 实现中实现一些技巧来实现不错的渲染速度,但遇到了麻烦。

光线追踪器渲染的场景中的对象存储在 KdTree 结构中,而树的节点又存储在数组中。我遇到问题的优化是在尝试将尽可能多的树节点放入缓存行时。这样做的一种方法是让节点只包含指向左子节点的指针。然后隐含的是,右孩子紧跟在数组中的左孩子之后。

节点是结构,在树构造期间,它们被静态内存管理器类成功放入数组中。当我开始遍历树时,起初它似乎工作得很好。然后在渲染早期的某个点(每次大约在同一个地方),根节点的左子指针突然指向一个空指针。我得出的结论是,当数组位于堆上时,垃圾收集器已经移动了结构。

我已经尝试了几种方法来将地址固定在内存中,但它们似乎都不能像我需要的那样持续整个应用程序的生命周期。'fixed' 关键字似乎只在单个方法调用期间有帮助,并且声明 'fixed' 数组只能在节点不是的简单类型上完成。有没有一个好的方法可以做到这一点,或者我只是在 C# 不适合的东西的道路上走得太远了。

顺便说一句,改用 c++ 虽然可能是高性能程序的更好选择,但不是一种选择。

0 投票
7 回答
18160 浏览

c# - C# 不安全/固定代码

有人可以举例说明在 C# 代码中实际使用“不安全”和“固定”的好时机吗?我以前玩过它,但从未真正找到它的好用处。

考虑这段代码...

与简单地使用...

第二个是在 .NET Framework 中找到的代码,第一部分是从 Microsoft 网站http://msdn.microsoft.com/en-us/library/28k1s2k6(VS.80).aspx复制的代码。

内置的 Array.Copy() 比使用 Unsafe 代码快得多。这可能只是因为第二个写得更好,第一个只是一个例子,但是你真的需要在什么情况下使用不安全/固定代码?还是这个可怜的 Web 开发人员在搞乱他头上的东西?

0 投票
5 回答
3513 浏览

c# - C# 中的固定语句

在我们的一个项目中,我们有与以下类似的代码。谁能解释(用简单的英语)为什么这里需要固定语句?

0 投票
6 回答
9454 浏览

c# - 程序终止后抛出的异常(遇到的错误)

我有一个似乎只有在程序关闭后才抛出异常的应用程序。而且非常不一致。(我们都知道不一致的错误是多么有趣......)

我的猜测是清理过程中出现错误。但是这些内存读/写错误似乎表明我的“不安全”代码使用有问题(指针?)。

我感兴趣的是调试这些情况的最佳方法是什么?
如何调试已经关闭的程序?
我正在寻找一个起点来解决一个更大的问题。

这些错误似乎以多种方式出现(一些运行时,一些调试):

0 投票
4 回答
4931 浏览

c# - C#项目设置“允许不安全代码”的实际作用是什么

我想知道 C# 项目设置“允许不安全代码”是否仅适用于项目本身中的不安全 C# 代码,或者在链接本机 C++ DLL 时是否需要设置此选项?如果在托管 DLL 中链接本身链接到本机 DLL 呢?这个选项到底在做什么?

0 投票
10 回答
18027 浏览

c# - 哪个更快 - C# 不安全代码或原始 C++

我正在编写一个图像处理程序来执行视频帧的实时处理。它在 C# 中使用包装 OpenCV 库 dll(非托管 C++)的 Emgu.CV 库(C#)。现在我必须编写自己的特殊算法,并且它需要尽可能快。

哪个将是算法的更快实现?

  1. 在 C# 中编写“不安全”函数

  2. 将函数添加到OpenCV库并通过Emgu.CV调用

我猜 C# unsafe 速度较慢,因为它通过 JIT 编译器,但差异会很大吗?

编辑:

在 VS2008 下为 .NET 3.5 编译

0 投票
2 回答
753 浏览

c# - 为什么允许从函数内返回不安全的指针?

我最近看到了几个真正做到这一点的开源项目。从函数返回一个不安全的指针,例如:“int* input = this.someIterator.GetUnsafePtr()”。

据我了解,这一定是完全错误的。不安全的指针只能通过“固定”语句获得,当然那些从函数内返回的指针将不再被固定(它们将“失去”它们的声明范围),导致它们最终被垃圾回收。

但是我也不记得编译器对此有任何警告,那么如果您实际上可以将“未固定”指针分布在各处,为什么还要费心使用固定语句呢?

0 投票
11 回答
20528 浏览

c# - 你应该在 C# 中使用指针(不安全代码)吗?

您应该在 C# 代码中使用指针吗?有什么好处?是 The Man (Microsoft) 推荐的吗?

0 投票
1 回答
641 浏览

c# - 固定和不安全有什么区别

为什么在 .NET 中有两种不同的方式锁定内存?它们之间有什么区别?

0 投票
3 回答
1696 浏览

c# - 是否有与 /unsafe 标志对应的“预处理器”符号?

我正在处理WriteableBitmapC# 中的一个。我目前正在使用不安全的代码块通过WriteableBitmap.BackBuffer. 但是,我宁愿不依赖于该/unsafe选项,因此我正在考虑改用该选项WriteableBitmap.WritePixels

是否有某种方法可以在“不安全”版本中进行有条件地编译,以便在使用 /unsafe 编译选项时可以使用它,而无需手动集成到我的项目文件中?

简而言之,我正在寻找以下内容:

运行时检测也很好;但这意味着我总是需要用 编译 /unsafe这意味着库代码需要更新项目文件,这不太方便。

基本上,我想在重要的时候保留快速版本,但有一个合理的版本,无论如何都可以工作。