在我们为嵌入式系统的代码中删除了所有对malloc和calloc的调用后,我惊讶地发现仍然链接了malloc。调用图将我指向一个没有显式*alloc调用的函数,并且没有调用任何可能分配内存的库函数,比如
我不得不查看生成的汇编代码才意识到,这是由一个包含VLA的内联函数引起的。
strdup
。我不得不查看生成的汇编代码才意识到,这是由一个包含VLA的内联函数引起的。
我认为VLA必须是堆栈分配的。这个编译器有问题吗?
strdup
。我认为VLA必须是堆栈分配的。这个编译器有问题吗?
alloca
。
来源1:https://dev59.com/bHI-5IYBdhLWcg3wCz7y#2035292
其次,VLA通常在堆栈上分配,但由于其大小可变,在一般情况下,其在内存中的确切位置在编译时是未知的。因此,底层实现通常必须将其实现为指向内存块的指针。这会引入一些额外的内存开销(用于指针),但出于上述原因,这完全是微不足道的。这也会引入轻微的性能开销,因为我们必须读取指针值才能找到实际的数组。这与访问malloc的数组时获得的开销相同(并且不使用命名的编译时大小的数组时不会获得)。
来源2:https://en.wikipedia.org/wiki/Variable-length_array
在语言支持可变长度数组的情况下,可能隐藏着底层内存分配的问题:在堆和栈有明确区别的环境中,可能不清楚哪一个(如果有)将存储VLA。
uint8_t
,所以最坏情况下需要256字节,大约是堆栈的五分之一。 - AShellychar arr [256]
而不是VLA? - Matt