如果我在堆栈上分配一些东西,分配是否确定(即RT)?分配示例:
new JsonEncoder.withIndent(" ").convert(map)
我的意思是在堆上分配需要系统调用(在一般情况下),这是非确定性的,因此应该禁止RT行为。
但是就RT行为而言堆栈分配会发生什么?
答案 0 :(得分:3)
当然,这是所有实现定义的,但一般来说,堆栈分配本身只是向堆栈指针添加一个常量值,因此这与在整数变量中添加值一样具有确定性。 / p>
其他操作通常与堆栈分配一致,但这可能使其时序不确定。具体做法是:
答案 1 :(得分:3)
std::vector
对象本身是堆栈分配的,但该对象仅包含指向堆分配数据数组的指针。 (当然,C ++标准从不使用" stack"也不是" heap&#34 ;;上面的句子只是通常的实现。)因此,分配容量为13的向量几乎肯定会涉及堆分配。
然而,
在堆上分配需要系统调用(无论系统如何)
不一定是这种情况。大多数堆分配不需要与系统进行任何交互。确实,在大多数系统中,一些堆分配需要系统调用(以修改虚拟内存映射),因此它们不能被视为实时,但很可能想象一个基于非虚拟内存的嵌入式系统,其中应用程序具有固定的内存分配,而malloc要么取消部分内存,要么失败。 [注1]
您可以使用从预保留池中分配内存区域的自定义分配器,但为了保证RT,您还需要确保预先保留的池是内存驻留的。
答案 2 :(得分:1)
实际上堆栈分配也可能需要系统调用,您的线程堆栈可能有保留的地址范围,但实际内存可能尚未提交。一旦你的代码尝试使用堆栈内存进行某些阵列请求,物理内存可能会失败。
所以为了超级安全 - 你必须只使用静态数组,如果这就是你想要的。据我所知,一些嵌入式系统禁止使用malloc / free。