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

c# - 什么时候需要在 C# 中使用 stackalloc 关键字?

stackalloc关键字提供什么功能?我何时以及为什么要使用它?

0 投票
5 回答
33674 浏览

c# - `stackalloc` 关键字的实际使用

有人stackalloc在用 C# 编程时实际使用过吗?我知道它是做什么的,但它唯一一次出现在我的代码中是偶然的,因为 Intellisense 在我开始输入时会建议它static,例如。

虽然与 的使用场景无关,但stackalloc我实际上在我的应用程序中做了相当多的遗留互操作,所以我时不时可以求助于使用unsafe代码。但尽管如此,我通常会找到unsafe完全避免的方法。

而且由于 .Net 中单个线程的堆栈大小约为 1Mb(如果我错了,请纠正我),因此我更不愿意使用stackalloc.

是否有一些实际案例可以说:“这正是我不安全和使用的正确数量的数据和处理stackalloc”?

0 投票
3 回答
1528 浏览

c# - c# 编译器是否决定自行使用 stackalloc?

我发现一个博客条目表明有时 c# 编译器可能决定将数组放在堆栈而不是堆上:

通过堆栈分配提高性能(.NET 内存管理:第 2 部分)

这个人声称:

编译器有时也会决定自己把东西放在堆栈上。我用 TestStruct2 做了一个实验,我给它分配了一个不安全和正常的上下文。在不安全的上下文中,数组被放在堆上,但在正常的上下文中,当我查看内存时,数组实际上是在堆栈上分配的。

有人可以确认吗?
我试图重复他的例子,但每次我尝试数组都分配在堆上。

如果 c# 编译器可以在不使用 'unsafe' 关键字的情况下做到这一点,我对它特别感兴趣。我有一个代码正在处理许多小字节数组(8-10 个字节长),因此为每个新字节使用堆 [...] 是浪费时间和内存(尤其是堆上的每个对象都有 8 个字节的开销垃圾收集器需要)。

编辑:我只想描述为什么它对我很重要:
我正在编写与 Gemalto.NET 智能卡通信的库,它可以在其中运行 .net 代码。当我调用一个返回某些东西的方法时,智能卡返回 8 个字节来描述我返回值的确切类型。这 8 个字节是通过使用 md5 哈希和一些字节数组连接计算得出的。
问题是,当我有一个我不知道的数组时,我必须扫描应用程序中加载的所有程序集中的所有类型,并且对于每个类型,我必须计算这 8 个字节,直到找到相同的数组。
我不知道找到类型的其他方法,所以我试图尽可能加快速度。

0 投票
3 回答
164 浏览

c++ - 奇怪的堆栈上的c ++分配

g++ 的奇怪之处(也许其他编译器也有?):

用 g++ 编译:

第一种分配不构造对象。我错过了什么?

0 投票
2 回答
1544 浏览

c++ - PIMPL 和堆栈分配

所以我一直在考虑 PIMPL 和堆栈分配。我一直在编写一个库,并决定使用 PIMPL 来隐藏该类的私有成员。这意味着我会有一个像这样声明的类

这很简单。但是然后在构造函数中你这样做

因此,当有人使用我的库在堆栈上创建 Foo 时,他们本质上是在进行堆分配。这是您在使用 PIMPL 时必须接受的权衡吗?我想在构造函数旁边发布带有警告的文档:“警告:这会导致堆分配”或类似的东西。

我的另一个想法是让所有暴露给实现的类作为纯虚拟接口和一大堆返回智能指针的静态工厂方法。这也意味着堆分配,但没有任何技巧。

有什么想法或建议吗?我是否过分考虑使用我的库的程序员?

0 投票
3 回答
676 浏览

c# - 如何将 int 设置为 byte* C#

如何在字节*中的某个索引处将 int 转换为字节*?

理想情况下,我想要类似的东西:

它将位的第一部分设置为 igm[4],其余部分设置为 igm[5]。

编辑:我意识到可能有很多可能的方法来处理这个问题,如果可能的话,我正在寻找最有效的方法。

0 投票
1 回答
152 浏览

c# - 不安全代码中的安全索引

早上好,下午或晚上,

前言:下面的代码并没有真正有用。这只是为了解释的目的。

在不安全代码中分配和使用数组“安全模式”有什么问题吗?例如,我应该把我的代码写成

或者我应该写一个单独的、不安全的方法,只接受指针和长度作为参数并在主函数中使用它?

另外,有什么办法可以用

这样我就可以Result用作指针并且仍然可以Result作为uint[]?

非常感谢你。

0 投票
2 回答
4273 浏览

c# - C# 和 .NET:stackalloc

我对操作员的功能有几个问题stackalloc

  1. 它实际上是如何分配的?我认为它做了类似的事情:

    但是我做了一些测试,我不确定它是如何工作的。我们不能确切地知道它做了什么以及它是如何做的,但我想知道基础知识。

  2. 我认为堆栈分配(嗯,我确实很确定)比堆分配快。那么为什么这个例子:

    /li>

给出堆栈分配 280~ 滴答的平均结果,而堆分配通常是1-0 滴答?(在我的个人电脑上,英特尔酷睿 i7)。

在我现在使用的计算机(Intel Core 2 Duo)上,结果比之前的更有意义(可能是因为优化代码没有在 VS 中检查): 堆栈分配 460~ 滴答,堆分配380 滴答

但这仍然没有意义。为什么会这样?我猜CLR注意到我们不使用数组,所以它甚至没有分配它?

0 投票
2 回答
1811 浏览

c# - 使用 stackalloc 初始化分配的内存

如果我stackallocC#中分配内存,该内存是否已初始化(使用0
文档没有提到这一点,只是告诉我们保留了正确的金额。

在我的测试中,这种内存默认为0,但这并不意味着它是有保证的。

0 投票
3 回答
741 浏览

c# - 不能在 C# 中使用 stackalloc 来初始化先前声明的指针吗?

我刚刚发现stackallocC# 的符号有一个令人难以置信的怪癖,请看下面的代码:

我的意图是在这样的三元表达式中使用 stackalloc:

编译器完全出乎意料的打击让我震惊。如果有人能对这种奇怪的行为有所了解,我将不胜感激。我已经在单声道和 .net 上对其进行了测试,但都不起作用。