Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否建议在C中使用带内联函数的可变长度数组(VLA)?_C - Fatal编程技术网

是否建议在C中使用带内联函数的可变长度数组(VLA)?

是否建议在C中使用带内联函数的可变长度数组(VLA)?,c,C,由于VLA被分配到堆栈上的内存,如果我们内联包含它们的函数,它们会导致任何问题吗?我认为,由于alloca的相同行为,即在堆栈上存储对象,编译器避免内联此类函数(?)。我认为分配给VLA(您正在使用的结构)堆栈的任何内存在某种程度上与分配给内联函数的内存区域不同。此外,当编译或解释内联代码时,这将是处理器/解析器的工作,而不是堆栈的工作。简而言之,我会说,不。然而(非标准的)alloca函数产生一个对象,其生命周期是调用函数,而VLA的生命周期是声明它的块。但是,内联与它们都不相关。其主体恰好内

由于VLA被分配到堆栈上的内存,如果我们内联包含它们的函数,它们会导致任何问题吗?我认为,由于alloca的相同行为,即在堆栈上存储对象,编译器避免内联此类函数(?)。

我认为分配给VLA(您正在使用的结构)堆栈的任何内存在某种程度上与分配给内联函数的内存区域不同。此外,当编译或解释内联代码时,这将是处理器/解析器的工作,而不是堆栈的工作。简而言之,我会说,不。

然而(非标准的)
alloca
函数产生一个对象,其生命周期是调用函数,而VLA的生命周期是声明它的块。但是,内联与它们都不相关。其主体恰好内联的函数调用仍然是函数调用,它通过
alloca
获得的对象在语义返回时不再存在,cpu执行ret指令或等效指令时不会出现这种情况。

如果函数内联并需要在堆栈上分配,会有什么区别?@a.S.H@lax在我看来本应被视为编译器错误。以改变语义的方式内联函数的编译器是不合格的。根据语义,当函数返回时,每个alloca都应该被释放,正确的内联必须尊重这个语义。@lax:VLA的语义与
alloca
的语义非常不同,因此示例不适用。此外,您在该链接上读到的内容很可能是用户错误(例如使用
\uu forceinline
或诸如此类)。如果您担心的是“inline”函数不会内联,但使用
alloca()
的替代实现也不会内联,那么您的境况不会比以前更好或更糟。如果您的编译器没有bug,如果您没有分配如此大的VLA以致堆栈崩溃——如果仍然可以内联函数——那么没有明显的理由不内联它。人们对VLA非常谨慎,因为无法报告“内存不足”;如果没有足够的空间,程序将崩溃。不过,符号的便利性是相当大的。您的评论令人费解——我不确定我是否理解您为什么认为VLA的内存将位于堆栈之外的任何位置。您知道在其他地方分配VLA的实现吗?我很难“解析”或“编译”以“除此之外”开头的句子……抱歉,也许我不是很清楚,也可能是大错特错,但我只是想指出,用于VLA的堆栈空间在逻辑上与用于内联语句的堆栈空间不同,以一种独立实体的方式?我现在将逻辑地释放自己,以防止溢出Jon!!