问题标签 [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.
c# - 如何将stackalloc内存复制到数组中?
使用stackalloc
内存时,我想将其内容复制到数组中/从数组中复制。我正在寻找类似于Buffer.BlockCopy
允许我传递源数据中的偏移量和目标中的偏移量的东西。
有没有这样的stackalloc
记忆方法?或者一般来说——如何在不逐个元素迭代的情况下一次性复制内存?
重要的问题:我要问的数组已经存在。所以我不能从stackalloc
内存中创建一个数组,然后将该数组复制到现有数组,因为它首先会使整个使用点无效stackalloc
。
c# - 当本地 stackalloc 上的数据时,匿名委托不为每次迭代使用新的本地
在 C# 中使用匿名delegate
s 时,CLR 将在堆上为使用的变量生成本地(例如当前范围内的变量)的副本。对于当前作用域的每个声明变量,这样的局部变量将被放入堆中。
您可以在此示例中看到此行为:
该程序的输出是(最后 5 个条目的顺序可能会有所不同,而在第一个条目中,也可能得到小于 5 的数字。):
在方法中调用时,C# 应始终生成本地的新副本。这在本示例中按预期工作:
输出:
这是有问题的情况:但是,将变量分配给保留区域时它不起作用:stackalloc
输出:
使用常规局部变量时 - 只需替换call
上面示例中的方法:
输出:
这种情况使我不信任delegate
C# 中的匿名 s - 因为我不明白 C# 何时不会搞砸我对匿名delegate
s 的调用。
我的问题:为什么 C# 不跟踪stackalloc
有关匿名delegate
s 的空间?我知道 C# 没有跟踪。我想知道为什么它不跟踪,如果它使用常规变量。
我使用 .NET Core 2.1 和 C# 7.3,包括/unsafe
这些示例的开关。
c# - 从 Span 中获取指针 (IntPtr)保持安全模式
我想使用 Span 和 stackalloc 来分配结构数组并将其传递给互操作调用。是否可以在不安全的情况下从 Span 中检索指针(IntPtr)?
c# - 如何读取堆栈分配内存的元素计数?
假设我只有一个先前堆栈分配内存的指针,我想知道我有多少元素。怎么做?
MSDN说:“stackalloc
在公共语言运行时使用自动启用缓冲区溢出检测功能”所以我猜大小保持在某个地方。
c# - 将 C# 原始缓冲区重新解释为 blittable 结构
我正在寻找一种方法来将任意不安全的内存区域重新解释为 C# 中的 blittable 结构。到目前为止,这是我可以写的一次失败的尝试:
尽管如此,打印的内存地址都是不同的(我希望打印相同的地址)。第一次尝试使用Unsafe.AsRef<T>(..)
微软提供的方法,其中方法的描述说:
将给定位置重新解释为对 type 值的引用
T
。
我不确定为什么这里没有正确完成重新解释。
有什么建议吗?
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' 或其依赖项之一。该系统找不到指定的文件。
如何解决问题并消除异常?
c# - 是否有必要仅在定义指向它的指针的同一行中使用`stackalloc`?
在以下代码中:
有什么办法可以去掉多余的变量temp
?
编码:
有编译器错误:
严重性代码 描述 项目文件行抑制状态错误 CS8346 无法将“double”类型的 stackalloc 表达式转换为“double*”类型。
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
但没有效果。
c# - 免分配枚举和处理
我想解决 ac# 应用程序的大量分配成本。应用程序本身可以由TickUser
底部的类表示,我想知道如何实现TickStream
对象以及使用免分配数据的DoWork
方法ProcessTick
。
在TickStream
类中,我可以删除该IEnumerable<Tick> GetTicks()
方法并将其替换为MoveNext()
/ Current { get; }
/Current()
模式。
也许ref readonly TickPointer Current()
?
c# - 如何使用 C# stackalloc 并保持相同的代码结构?
我有一个MemRead
读取内存并返回字节数组的方法
而且我有方法MemReadInt32
,,MemReadBool
...调用MemRead
并进行转换
现在我想在堆栈而不是堆上分配缓冲区,所以我更改了这一行
至
编译器会抛出错误,因为堆栈分配的数组不能暴露在声明范围之外。这是有道理的,这可以防止潜在的堆提升。
但是后来我不得不将转换代码放在与阅读代码相同的方法中。MemReadInt32
并且每个, MemReadBool
, ...都会重复读取代码
我怎样才能避免重复ReadMem
代码,并且仍然获得堆栈分配?