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

时间:2019-07-12 14:42:43

标签: c arrays memory embedded

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

int length = 5 ; 
int array[length];

2 个答案:

答案 0 :(得分:4)

根据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通常是利用帧指针来实现的,但并非所有架构都具有帧指针。

答案 1 :(得分:3)

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

如果有上限(例如,示例中length的上限)并且可以证明您的内存(堆栈大小,总RAM,...,在最坏的情况下仍然足够)。

这就是为什么嵌入式或关键系统的编码规则经常会限制您的工作。