问题标签 [static-memory-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 投票
5 回答
1944 浏览

c++ - 范围结束后静态分配的内存会发生什么?

该函数调用完成后,分配给指针变量“a”和“a”指向的 4 整数块的内存究竟会发生什么?块和指针变量的内存是否被取消分配,还是会造成某种内存泄漏?

0 投票
3 回答
3594 浏览

memory-management - 为什么我们不应该在嵌入式系统中动态分配不同大小的内存

我听说在嵌入式系统中,我们应该使用一些预先分配的固定大小的内存块(比如伙伴内存系统?)。有人能给我详细解释一下为什么吗?谢谢,

0 投票
1 回答
1099 浏览

compile-time - 静态变量的内存分配(编译时内存分配)

静态变量的内存分配是在编译时完成的。

  1. 如果我多次编译我的应用程序,每次都会分配内存吗?
  2. 如果是,那么到那时,它可能会消耗我计算机的全部内存。实际上,它永远不会发生,如何?
  3. 此外,当我们在其他计算机上运行同一应用程序的可执行文件时,它会成功运行。如果它是在其他计算机上编译的,它如何在其他计算机的内存中找到静态变量。
  4. 另外,如果我启动同一个应用程序的多个实例,是否会为所有实例创建静态变量的副本,或者在所有实例之间共享单个静态变量?我认为,副本将被创建。但是在这里我怀疑内存是在编译时分配的,并且应用程序的一个实例可以使用该内存,那么其他实例将如何为该静态变量分配内存。

    总的来说,我怀疑“编译时的内存分配”到底是什么意思?

0 投票
5 回答
2096 浏览

c - 内存的静态和动态分配

我在静态内存分配和动态内存分配的文档中读到

静态内存分配是指在相关程序执行之前在编译时保留内存的过程,与在运行时进行的动态内存分配不同。

我的问题是:-

在编译期间如何保留内存?

举个例子

上面的代码是一个例子static memory allocation

该变量i仅在运行时(即程序执行期间)加载到内存中,那么在编译时如何为它分配内存?

0 投票
1 回答
773 浏览

c - 数组大小应该在编译时知道

我写了一个简单的代码,我在其中创建没有固定大小的数组。我尝试编译代码gcc,它工作正常。请解释为什么在编译时应该知道这是有效的数组大小。

这是我使用的代码。

0 投票
1 回答
183 浏览

c - 什么是堆栈重新分配,什么时候发生?

据说您可能会发生堆栈重新分配。我不明白这一点。我认为 setjmp/longjmp 的全部目的是保存堆栈,并且当 longjmp 回来时它会有效。该评论似乎表明可以移动整个堆栈。这将抵消所有指针,所以我明白为什么应该避免它。但是堆栈重新分配何时发生?我以前从未听说过这个词。

0 投票
1 回答
118 浏览

c++ - 保持类的向量成员与类实例连续

我有一个实现两个简单的、预先确定大小的堆栈的类;这些存储为由构造函数预先确定大小的向量类型类的成员。它们是小型且缓存行大小友好的对象。这两个堆栈的大小是恒定的,持久化和延迟更新,并且经常通过一些计算成本低的方法一起访问,然而,这些方法可以被调用很多次(每秒数万到数十万次)。

所有对象都已经处于良好状态(代码很干净并且可以执行它应该做的事情),所有大小都受到控制(包括结果在内的整个操作链的大多数情况下为 64k 到 128K,很少接近 256k,所以更糟糕的是L2 查找,通常是 L1)。

一些自动矢量化开始发挥作用,但除此之外,它始终是单线程代码。

这个类,减去一些小东西和填充,看起来像这样:

请忍受冗长,我正在努力教育自己,并确保我没有通过一些半开玩笑的知识来操作:

考虑到在它们上运行的操作及其实际用途,性能主要受内存 I/O 限制。我有一些与数据的最佳定位有关的问题,请记住,这是在 Intel CPU(Ivy 和一些 Haswell)上以及使用 GCC 4.4 时,我没有其他用例:

我假设如果控件和段的实际存储与 Curve 的实例相邻,这是缓存的理想方案(从大小上看,很多可以很容易地适合我的目标 CPU)。一个相关的假设是,如果向量远离 Curve 的实例,并且在它们之间,当方法交替访问这两个成员的内容时,将会有更频繁的驱逐和重新填充 L1 缓存。

1)这是正确的(数据是从新操作中首先查找的地址中提取的整个缓存大小的数据,而不是方便的适当大小的多个段),还是我误解了缓存机制和缓存可以拉动并保存多个较小的 ram 吗?

2)根据上述情况,就纯粹的情况而言,我所有的测试总是以类的实例和连续的向量结束,但我认为这只是运气不好,无论在统计上多么有可能。通常实例化该类仅保留该对象的空间,然后将向量分配在下一个可用的空闲连续块中,如果之前在内存中找到一个小的空位,则不能保证它位于我的 Curve 实例附近的任何地方。这个对吗?

3) 假设 1 和 2 是正确的,或者从功能上讲足够接近,我理解为了保证性能,我必须编写一个分配器以确保类对象本身在实例化时足够大,然后复制向量在那里我自己和从那里参考那些。如果这是解决问题的唯一方法,我可能会破解类似的方法,但如果有很好/聪明的方法来解决类似的问题,我宁愿不要可怕地破解它。任何关于最佳实践和建议方法的指示都会非常有帮助(除了“不要使用 malloc,它不能保证是连续的”,我已经知道了 :))。

0 投票
1 回答
1990 浏览

c++ - C++ 中的全局动态 Allcoat 变量

内存分为三种:静态内存(静态变量/成员、全局变量)、栈和堆。

全局变量的定义是在任何函数之外定义的变量。

我想知道下面的代码,

它可以编译并运行。但我想知道的是,该数组在哪里分配?它是堆上的全局变量吗?

C++ Primer 说当程序结束时全局变量将被释放。我的问题是,即使它们在堆上也会发生这种情况吗?

0 投票
2 回答
122 浏览

c++ - 为什么 cpp 允许访问我尚未分配的内存?

在 cpp 中,可以使用数组声明作为 typename array[size]; typename *array = new typename[size]; 其中数组的长度为“大小”,元素的索引从“0”到“大小-1”这里我的问题是我是否允许访问索引> =大小之外的元素。

所以我写了这个小代码来检查它

结果是这样的

程序不应该崩溃而是给出垃圾值。对于这两种分配方法,它给出了相同的结果。它会产生更多难以检测的错误。它与我正在使用的环境或编译器或其他任何东西有关吗?

我在 Windows 8.1 上使用具有 TDM-GCC 4.8.1 编译器的代码块 IDE

提前致谢。

0 投票
3 回答
604 浏览

c - C/C++ 中的 float* 和 float[n] 有什么区别

使用和使用有什么区别

还是他们的待遇完全相同?使用其中一个可能会导致您遇到内存分配问题吗?如果不是,是否有任何情况可以区别对待?

不知道这是否相关,但我使用类型 float* 作为函数参数。例如:

它编译并运行良好(我不太确定为什么 - 我认为因为我没有分配任何内存f,它会引发某种异常)。