在嵌入式系统中使用 c 中的可变长度数组有问题吗?

Ahm*_*ged 2 c memory arrays embedded

有人告诉我用非常量值初始化数组是错误的,但我需要知道为什么。

int length = 5 ; 
int array[length];
Run Code Online (Sandbox Code Playgroud)

Bod*_*odo 5

由于资源有限,在嵌入式系统上使用非恒定长度的数组可能会出现问题。您必须确保在所有情况下可用内存都足够。如果使用动态分配或可变长度数组,则很难证明这一点。

如果存在上限(即length示例中的值的上限)并且您可以证明您的内存(堆栈大小、总 RAM,...,任何适用的)仍然足够,那么可能没问题在最坏的情况下。

这就是为什么嵌入式或关键系统的编码规则通常会限制您可以执行的操作。


Chr*_*ons 5

根据 Linus Torvalds 的说法,可变长度数组对嵌入式编程世界没有任何积极价值,并带来了问题包袱,包括稳定性和速度问题。建议在合理的情况下只使用足够大的固定大小的数组,否则在堆上分配数组。

VLA 对于嵌入式和系统编程是有问题的,因为堆栈通常非常有限。代码生成通常也会受到负面影响,这会使其成为一个非常不方便的功能(帧指针不是免费的,并且寄存器通常可以更有效地用于其他用途)。

如果您的数组长度被限制为一个已知值,您通常最好只使用最大大小。如果最大尺寸太大而不是一个好的方法,请参阅上面关于有限堆栈尺寸的信息。

简而言之:VLA 不会为您购买嵌入式和系统编程方面的任何东西,它们确实会引起问题。

[...]

有些人似乎真的没有意识到,嵌入式和系统编程是不同的“正常”的节目。资源是有限的,你不能 只是失败。你通常不能只是说“哎呀,我没有足够的内存,我就退出”。

https://www.realworldtech.com/forum/?threadid=121531&curpostid=121621

Linus 的进一步意见,摘自 Linux 内核邮件列表:

并且使用 VLA 是非常愚蠢的!与仅使用固定的密钥大小相比,它会生成更多的代码,以及更慢的代码(以及更脆弱的代码)。

https://lkml.org/lkml/2018/3/7/621

我还认为值得重申 Eric PostPischil 的评论,即从 C11 开始,VLA 是可选的。在嵌入式系统中工作时,您会看到更多种类的硬件架构,其中一些可能更难以实现 VLA,因此您可能会遇到不支持它们的系统。

从我对此事的了解来看,似乎 VLA 通常是使用帧指针实现的,但并非所有架构都具有帧指针。