问题标签 [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 回答
1584 浏览

c# - 如何在枚举中使用不安全的值?

我需要在我的 C# 应用程序中使用这个枚举,但它不允许我使用这些值。当我将类型指定为 uint 时,我可以使用 -1 值,而当我指定 int 时,我不能使用最后 2 个值。有没有办法在这里使用 unchecked 关键字来允许我定义所有这些值?这些值来自外部来源,所以我无法更改它们。

0 投票
2 回答
943 浏览

c# - 对于小型密集型任务,C# 与 C++ 的性能有多接近?

我在考虑 C++ 与 C# 的速度差异主要是关于 C# 编译为由 JIT 编译器接收的字节码(正确吗?)以及 C# 所做的所有检查。

我注意到可以在编译选项中关闭很多这些功能,也可能通过使用unsafe关键字作为公共语言运行时无法验证的不安全代码。

因此,如果您要用两种语言编写一个简单的控制台应用程序,将想象中的硬币翻转无限次,然后每 10,000 次左右迭代将结果显示到屏幕上,速度会有多大差异?我选择这个是因为它是一个非常简单的程序。

我想对此进行测试,但我不知道 C++ 或没有编译它的工具。这是我的 C# 版本:

差异是否足以保证故意将代码段编译为“不安全”或编译成没有某些编译选项(如启用溢出检查)的 DLL?还是相反,在 C++ 中编译部分是有益的?我确信互操作速度也会发挥作用。

为避免主观性,我重申这个问题的具体部分:

  • C# 是否因使用不安全代码而提高了性能?
  • 诸如禁用溢出检查之类的编译选项是否会提高性能,它们是否会影响不安全的代码?
  • 上面的程序在 C++ 中会更快还是几乎可以忽略不计?
  • 是否值得用 C++ 等语言编译长时间密集的数字运算任务或使用 /unsafe 来获得奖励?不那么主观,我可以通过这样做更快地完成一个密集的操作吗?
0 投票
3 回答
286 浏览

c# - 无法将指针数组放入 C# 中的不安全结构中的根本原因是什么?

如果可以像在 C# 中那样将一组指向子结构的指针放在 C# 中的不安全结构中,那么构建复杂的数据结构而无需每个节点拥有一个对象的开销会容易得多,而且耗时更少,并且语法更清晰,可读性更强。

为什么不安全结构中的固定数组只允许由“值类型”而不是指针组成,是否有深层的架构原因?

我假设只有在结构中显式命名的指针必须是故意削弱语言的决定,但我找不到任何关于为什么会这样的文档,或者不允许在结构中使用指针数组的原因,因为我会假设垃圾收集器不应该关心标记为不安全的结构中发生了什么。

相比之下,Digital Mars 的 D 优雅地处理结构和指针,我错过了不能快速开发简洁的数据结构;通过在 C# 中使引用抽象化,语言似乎已经消除了很多功能,即使指针至少在营销意义上仍然存在。

也许我期望语言随着时间的推移在有效地表示复杂数据结构方面变得更加强大是错误的。

0 投票
3 回答
3419 浏览

c# - 为什么我的不安全代码块比我的安全代码慢?

我正在尝试编写一些代码来方便地处理视频帧。我将帧作为System.Windows.Media.Imaging.WriteableBitmap. 出于测试目的,我只是应用了一个简单的阈值过滤器,它将处理 BGRA 格式的图像,并根据 BGR 像素的平均值将每个像素分配为黑色或白色。

这是我的“安全”版本:

这是我认为使用不安全代码块和 WriteableBitmap Back Buffer 而不是前缓冲区的直接翻译:

这是我第一次尝试不安全的代码块和指针,所以逻辑可能不是最优的。

我已经使用以下方法在同一个 WriteableBitmaps 上测试了两个代码块:

所以我正在分析相同的图像。输入视频帧流的测试运行:

为什么我的不安全版本总是变慢?是因为使用了后台缓冲区吗?还是我做错了什么?

谢谢

0 投票
4 回答
8758 浏览

c# - 安全与不安全代码

今天阅读这个关于安全和不安全代码的问题,然后我在MSDN中阅读了它,但我仍然不明白。为什么要在 C# 中使用指针?这纯粹是为了速度吗?

0 投票
2 回答
1173 浏览

c# - 在不安全代码中分配指针时,null 和 0 之间有什么区别吗?

这可能看起来很奇怪,但在 C (size_t)(void*)0 == 0 中,语言规范不保证。允许编译器使用任何他们想要的 null 值(尽管他们几乎总是使用 0。)

在 C# 中,您可以将 null 或 (T*)0 分配给不安全代码中的指针。

  1. 有什么区别吗?
  2. (long)(void*)0 == 0 (保证与否?换句话说:IntPtr.Zero.ToInt64() == 0)

MSDN 对 IntPtr.Zero 有这样的说法:

“该字段的值不等于null。” 好吧,如果您想与 C 代码兼容,那很有意义 - 如果互操作没有转换为 C 空指针,它将毫无价值。但我想知道 IntPtr.Zero.ToInt64() == 0 是否可能,即使在内部 IntPtr.Zero 是其他一些值(CLR 可能会也可能不会在强制转换操作中将 null 转换为 0)

不是这个问题的重复

0 投票
2 回答
540 浏览

c# - 帮助将 Reflector 解构转换为可编译的代码

所以我正在反射一些框架 2.0 代码并最终得到以下解构

由于“ The right hand side of a fixed statement assignment may not be a cast expression” ,这将无法编译

我知道反射器只能近似,通常我可以看到一条清晰的路径,但这有点超出我的经验。

问题:Reflector 试图向我描述什么?

更新:

我还看到以下内容

更新:

因此,正如 Mitch 所说,它不是按位运算符,而是 addressOf 运算符。

现在的问题是:

失败并出现“ Cannot implicitly convert type 'xxx*' to 'System.IntPtr*'. An explicit conversion exists (are you missing a cast?)”编译错误。

因此,如果我这样做,我似乎该死,如果我不这样做,我似乎该死。有任何想法吗?

更新:

我想我想通了。偶然地,我回到使用void*并删除演员表的表达,VS停止抱怨,因为我从这次对话的参与者那里收集到void*并且intptr*是等价的,所以我只是将它们换掉,结果是:

VS 不再抱怨了。有人可以验证

相当于

?

0 投票
3 回答
653 浏览

c# - 如何在循环中更改新结构的地址?

我正在编写一个简单的程序,它是关于在 C# 中使用链表的多项式。我遇到的问题是,每当它在 for 循环中创建一个新结构(节点)时,它都会给它与前一个节点相同的地址。我该如何解决?这是我的结构:

这就是问题发生的地方:

&q保持不变!

更新:

为了更清楚地说明,这里是完整的代码:

我们的教授要求我们用 C 来做,但我们决定用 C# 来做,但给它一个 C 的外观,因为没有人真正使用 C。

0 投票
1 回答
402 浏览

c# - 0 - 65535 之间的第一个内存地址的空引用

我想了解更多关于内存的信息,但我无法从谷歌中找到它,如果这是一个愚蠢的问题,请原谅我。

为什么下面的代码,在 C# 中访问内存地址 0(最多 65535)会抛出 NullReferenceException

字节*指针=(字节*)0;

字节测试 = *指针;

提前非常感谢!

0 投票
1 回答
8736 浏览

c# - 为什么固定大小的缓冲区(数组)一定是不安全的?

假设我想要一个 7 字节(或 3 或 777)的值类型。

我可以这样定义:

定义它的更简单方法是使用固定缓冲区

当然,第二个定义更简单。问题在于必须为固定缓冲区提供的 unsafe 关键字。我知道这是使用指针实现的,因此不安全。

我的问题是为什么它必须是不安全的?为什么 C# 不能提供任意恒定长度的数组并将它们保留为值类型,而不是使其成为 C# 引用类型数组或不安全的缓冲区?