问题标签 [stackalloc]

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 回答
703 浏览

c# - 如何将stackalloc内存复制到数组中?

使用stackalloc内存时,我想将其内容复制到数组中/从数组中复制。我正在寻找类似于Buffer.BlockCopy允许我传递源数据中的偏移量和目标中的偏移量的东西。

有没有这样的stackalloc记忆方法?或者一般来说——如何在不逐个元素迭代的情况下一次性复制内存?

重要的问题:我要问的数组已经存在。所以我不能从stackalloc内存中创建一个数组,然后将该数组复制到现有数组,因为它首先会使整个使用点无效stackalloc

0 投票
1 回答
251 浏览

c# - 当本地 stackalloc 上的数据时,匿名委托不为每次迭代使用新的本地

在 C# 中使用匿名delegates 时,CLR 将在堆上为使用的变量生成本地(例如当前范围内的变量)的副本。对于当前作用域的每个声明变量,这样的局部变量将被放入堆中。

您可以在此示例中看到此行为:

该程序的输出是(最后 5 个条目的顺序可能会有所不同,而在第一个条目中,也可能得到小于 5 的数字。):

在方法中调用时,C# 应始终生成本地的新副本。这在本示例中按预期工作:

输出:

这是有问题的情况:但是,将变量分配给保留区域时它不起作用:stackalloc

输出:

使用常规局部变量时 - 只需替换call上面示例中的方法:

输出:

这种情况使我不信任delegateC# 中的匿名 s - 因为我不明白 C# 何时不会搞砸我对匿名delegates 的调用。

我的问题:为什么 C# 不跟踪stackalloc有关匿名delegates 的空间?我知道 C# 没有跟踪。我想知道为什么它不跟踪,如果它使用常规变量。

我使用 .NET Core 2.1 和 C# 7.3,包括/unsafe这些示例的开关。

0 投票
0 回答
2706 浏览

c# - 从 Span 中获取指针 (IntPtr)保持安全模式

我想使用 Span 和 stackalloc 来分配结构数组并将其传递给互操作调用。是否可以在不安全的情况下从 Span 中检索指针(IntPtr)?

0 投票
1 回答
50 浏览

c# - 如何读取堆栈分配内存的元素计数?

假设我只有一个先前堆栈分配内存的指针,我想知道我有多少元素。怎么做?

MSDN说:“stackalloc在公共语言运行时使用自动启用缓冲区溢出检测功能”所以我猜大小​​保持在某个地方。

0 投票
1 回答
180 浏览

c# - 将 C# 原始缓冲区重新解释为 blittable 结构

我正在寻找一种方法来将任意不安全的内存区域重新解释为 C# 中的 blittable 结构。到目前为止,这是我可以写的一次失败的尝试:

尽管如此,打印的内存地址都是不同的(我希望打印相同的地址)。第一次尝试使用Unsafe.AsRef<T>(..)微软提供的方法,其中方法的描述说:

将给定位置重新解释为对 type 值的引用T

我不确定为什么这里没有正确完成重新解释。

有什么建议吗?

0 投票
0 回答
68 浏览

c# - 在 VS 2019 中使用 Span 会产生异常

System.Memory在 VS 2019 中添加了对控制台 C# 项目的引用以使用System.Span结构。但是下面的代码会产生异常:

异常消息是:

内部异常 FileNotFoundException: 无法加载文件或程序集 'System.Runtime.CompilerServices.Unsafe, Version=4.0.4.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' 或其依赖项之一。该系统找不到指定的文件。

如何解决问题并消除异常?

0 投票
1 回答
62 浏览

c# - 是否有必要仅在定义指向它的指针的同一行中使用`stackalloc`?

在以下代码中:

有什么办法可以去掉多余的变量temp

编码:

有编译器错误:

严重性代码 描述 项目文件行抑制状态错误 CS8346 无法将“double”类型的 stackalloc 表达式转换为“double*”类型。

0 投票
1 回答
2236 浏览

c# - 这种不安全的代码是否也适用于 .NET Core 3?

如果可能,我正在重构我的库以Span<T>用于避免堆分配,但由于我还针对较旧的框架,我也在实施一些通用的后备解决方案。但是现在我发现了一个奇怪的问题,我不太确定我是否在 .NET Core 3 中发现了一个错误,或者我是否在做一些非法的事情。

问题:

有趣的是,ReinterpretOld它在 .NET Framework 和 .NET Core 2.0 中运行良好(所以我毕竟对它感到满意),但它仍然让我有些困扰。

顺便提一句。ReinterpretOld也可以通过小修改在 .NET Core 3.0 中修复:

我的问题:

这是一个错误还是ReinterpretOld只是偶然在较旧的框架中起作用,我应该也为它们应用修复程序吗?

评论:

  • 调试版本也适用于 .NET Core 3.0
  • 我试图申请[MethodImpl(MethodImplOptions.NoInlining)]ReinterpretOld但没有效果。
0 投票
1 回答
53 浏览

c# - 免分配枚举和处理

我想解决 ac# 应用程序的大量分配成本。应用程序本身可以由TickUser底部的类表示,我想知道如何实现TickStream对象以及使用免分配数据的DoWork方法ProcessTick

TickStream类中,我可以删除该IEnumerable<Tick> GetTicks()方法并将其替换为MoveNext()/ Current { get; }/Current()模式。

也许ref readonly TickPointer Current()

0 投票
1 回答
452 浏览

c# - 如何使用 C# stackalloc 并保持相同的代码结构?

我有一个MemRead读取内存并返回字节数组的方法

而且我有方法MemReadInt32,,MemReadBool...调用MemRead并进行转换

现在我想在堆栈而不是堆上分配缓冲区,所以我更改了这一行

编译器会抛出错误,因为堆栈分配的数组不能暴露在声明范围之外。这是有道理的,这可以防止潜在的堆提升。

但是后来我不得不将转换代码放在与阅读代码相同的方法中。MemReadInt32并且每个, MemReadBool, ...都会重复读取代码

我怎样才能避免重复ReadMem代码,并且仍然获得堆栈分配?