问题标签 [stack-allocation]

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

c++ - 如何强制 MSVC 编译器省略大型临时对象的堆栈分配?

这个问题不是这个问题或其他类似问题的重复。这个问题是关于在初始化和使用清除结构。


更新

在阅读了您的前几条评论后,我想澄清我的问题:

  • 如何强制 MSVC 编译器省略大堆栈分配?

我更新了下面的标题、文本和代码以澄清这一点。


我最近开始使用/GS,/sdl/analyze编译器选项编译我的项目。(Microsoft Visual C++ 2015)使用这些选项,编译器可以正确警告有问题的代码结构。但是,我遇到了一些我一直认为是好的 C++ 风格的警告。

请查看以下示例代码:

有人告诉我,清除结构的标准 C++ 方法如下:

使用该/analyze选项,编译器会以下列方式警告这一点(示例):

C:\Dev\MDS\Proj\MDSCPV\Vaps_Common_lib\camber_radar.cpp:162:警告:C6262:函数使用堆栈的 '144400' 字节:超过 /analyze:stacksize '16384'.. 此分配用于编译器生成在第 162 行临时用于“struct BitmapBuffer”。考虑将一些数据移动到堆中。

我认为会发生以下情况:

  • 在栈上构造一个临时对象
  • 临时对象被复制到对象变量

我想看到那里发生的默认初始化。在我看来,编译器应该能够优化堆栈分配。但显然(根据警告)编译器没有这样做。我的问题是:如何强制编译器忽略堆栈分配? 我现在已经开始用以下代码替换这些地方:

0 投票
1 回答
188 浏览

c# - 元帅大小 const 数组

我正在尝试在结构内分配堆栈数组。好吧,我的意思是指针。但我希望在没有额外代码的情况下完成分配,因为我在编写代码时知道大小(我不想new在创建结构时做很多事情)。如果我什至可以在没有unsafe上下文的情况下做到这一点,那就完美了。我尝试了一些东西,但效果不佳。我是 C# 的新手,所以可能有一种我没有看到的方法!

0 投票
1 回答
60 浏览

c++ - 删除带有堆成员的对象

我正在研究 bitset 实现。bitset 使用一个数组unsigned long long来存储位。

由于我需要这个位集来存储大量数据,我发现当我初始化uint64使用new关键字在堆上构建它的数组时,它的效果最好。

这样做可以让我的程序始终如一地允许我的整个程序访问位数组。我遇到的一个问题是我的析构函数似乎无法删除数据

在没有析构函数的情况下工作,我得到了内存泄漏(如预期的那样),使用析构函数我得到一个运行时错误Error in `./a.out': double free or corruption (out): ,我尝试谷歌搜索无济于事。我对 c++ 相当陌生,因此对类中堆栈/堆行为的任何见解都将不胜感激。

0 投票
0 回答
452 浏览

java - JAVA 9 及更高版本中的逃逸分析和堆栈分配优化改进

HotSpot Java 9-13 的堆栈分配优化规则是否不那么严格?

在 Java 7 和 Java 8 HotSpot 对象堆栈分配(由于称为标量对象替换的 JVM 优化)是可能的,但要在线程堆栈上实现无垃圾分配,必须满足许多严格的约束。

为 Java 8(HotSpot、OpenJDK 8)启用堆栈分配优化的规则总结在对这个问题的精彩回答中: Hotspot 什么时候可以在堆栈上分配对象? 至于这里的 Java 7: Eligibility for escape analysis / stack allocation with Java 7

在这个问题中,我想了解更新 JDK 版本中 EA 和堆栈分配优化的当前状态是什么?其他 Java VM(例如 OpenJ9)是否有不同的规则?

0 投票
1 回答
358 浏览

c++ - 为什么堆栈内存在不使用时分配?

考虑以下示例:

生成的汇编代码vector::empty(通过 clang,经过优化):

为什么要分配堆栈空间?它根本不使用。和可以省略pushpopMSVC 和 gcc 的优化构建也为此函数使用堆栈空间(参见Godbolt),所以一定有原因。

0 投票
1 回答
53 浏览

c# - 免分配枚举和处理

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

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

也许ref readonly TickPointer Current()

0 投票
0 回答
82 浏览

visual-c++ - 通过 _malloca 的堆栈分配是否会触发通过 _CrtSetAllocHook 设置的分配挂钩

对于实时音频信号处理应用程序,我们希望确保实时线程中不会执行堆内存分配。作为开发过程中使用的内部调试工具,我们设置了一个堆分配钩子函数,通过_CrtSetAllocHook它检查分配线程的线程ID并断言它是否是实时线程。

在我们代码库的某些部分,我们现在使用_malloca/_freea来临时创建 < 400 字节的堆栈缓冲区。根据Microsoft 文档_malloca当分配的字节数大于定义的值时,执行堆分配而不是堆栈分配_ALLOCA_S_THRESHOLD_ALLOCA_S_THRESHOLD当前设置为 1024。

我们现在在分配低于阈值的小堆栈缓冲区时遇到堆分配断言_malloca,例如,如果不应该发生堆分配。_CrtSetAllocHook如果在决定执行堆栈分配的情况下也触发了通过设置的分配挂钩,我没有找到任何信息_malloca,但我觉得可能是这种情况。

所以第一个问题:有没有人找到任何关于这里可以预期的行为的官方文档?第二个问题:如果我假设的堆栈和堆分配都调用了 alloc 挂钩,那么我们应该如何确定执行哪种分配只触发堆分配的断言?

0 投票
1 回答
28 浏览

c++ - 堆栈分配的类类型。为什么两个 ID 实例的地址相同?

平台:Ubuntu终端(Windows的Ubuntu子系统)

编译:g++ 文件.cpp

输出:“ID 之间的地址相同”

输出不应该提供不同的堆栈地址吗?

我尝试用原始整数(而不是 ID 类类型)复制它,它为不同的实例输出不同的地址。

0 投票
2 回答
173 浏览

c - 在大多数操作系统中,为什么堆栈不能在运行时增加?

是为了避免碎片化吗?还是其他什么原因?内存分配的设置生命周期是一个非常有用的构造,与之相比,malloc()它具有手动生命周期。

0 投票
1 回答
138 浏览

vector - 如何加载 Vec 的所有条目任意长度到堆栈上?

我目前正在使用向量并试图确保我在堆栈上拥有本质上是我的向量数组的内容。我不能打电话Vec::into_boxed_slice,因为我在我的Vec. 这是可能吗?

在阅读了有关如何实现Vec的 Rustonomicon 之后,它似乎跨越了堆上的指针,在每个条目处取消引用。我想Vec将堆中的条目分块到堆栈中以便快速访问。