堆栈分配RT?

时间:2015-09-21 17:01:19

标签: c++ real-time allocation

如果我在堆栈上分配一些东西,分配是否确定(即RT)?分配示例:

new JsonEncoder.withIndent(" ").convert(map)

我的意思是在堆上分配需要系统调用(在一般情况下),这是非确定性的,因此应该禁止RT行为。

但是就RT行为而言堆栈分配会发生什么?

3 个答案:

答案 0 :(得分:3)

当然,这是所有实现定义的,但一般来说,堆栈分配本身只是向堆栈指针添加一个常量值,因此这与在整数变量中添加值一样具有确定性。 / p>

其他操作通常与堆栈分配一致,但这可能使其时序不确定。具体做法是:

  • 运行构造函数例程来初始化已分配的对象(构造函数当然可以做任何事情,具体取决于所讨论的类的作者在那里写的...例如它可以分配堆内存,打开并读取一个文件,进入无限循环等)
  • 写入(和/或读取)新分配的堆栈内存,如果内存区域尚未映射到物理RAM,则可能导致页面错误。
  • 当然,总是存在堆栈溢出的可能性,这可能导致分段错误(如果你很幸运),或者只是随机未定义的行为和混乱(如果你不是那么幸运)。< / LI>

答案 1 :(得分:3)

std::vector对象本身是堆栈分配的,但该对象仅包含指向堆分配数据数组的指针。 (当然,C ++标准从不使用&#34; stack&#34;也不是&#34; heap&#34 ;;上面的句子只是通常的实现。)因此,分配容量为13的向量几乎肯定会涉及堆分配。

然而,

  

在堆上分配需要系统调用(无论系统如何)

不一定是这种情况。大多数堆分配不需要与系统进行任何交互。确实,在大多数系统中,一些堆分配需要系统调用(以修改虚拟内存映射),因此它们不能被视为实时,但很可能想象一个基于非虚拟内存的嵌入式系统,其中应用程序具有固定的内存分配,而malloc要么取消部分内存,要么失败。 [注1]

您可以使用从预保留池中分配内存区域的自定义分配器,但为了保证RT,您还需要确保预先保留的池是内存驻留的。

注释。

  1. 或者你可以记住DOS / Apple;不需要生动的想象力。

答案 2 :(得分:1)

实际上堆栈分配也可能需要系统调用,您的线程堆栈可能有保留的地址范围,但实际内存可能尚未提交。一旦你的代码尝试使用堆栈内存进行某些阵列请求,物理内存可能会失败。

所以为了超级安全 - 你必须只使用静态数组,如果这就是你想要的。据我所知,一些嵌入式系统禁止使用malloc / free。