c - 调用约定会阻止可变大小的返回值吗?

标签 c calling-convention variable-length-array

如前所述here ,当从 C 函数返回可变大小数据时,您可以:

  1. 传递一个指针和最大长度。返回一个标志,指示是否达到最大值。
  2. 返回指向动态分配数据的指针。
  3. 返回指向全局数据的指针。

在典型硬件上是否有任何调用约定阻止通过调用堆栈返回动态大小的数据?

某些 C 编译器具有 VLA(或 alloca),因此调用堆栈上的可变大小数据是可能的。通过增加调用者的堆栈帧来实现可变大小数组返回值似乎相当简单,就好像声明了 VLA 而不是函数调用一样。返回后,被调用者会留下元素计数,然后是元素。

最佳答案

在 VLA 之前,我们使用了 alloca 标准库函数,它实际上返回了可变大小的数据。 (碰巧数据未初始化,但这对实现来说不是必需的。)所以显然这是可能的。

但是,有一个重要的细节:alloca每次调用都会分配存储空间,没有freea。释放存储的唯一方法是从调用 alloca 的函数返回。

对于本地存储分配来说,这是一个看似合理的接口(interface),但对于返回有用数据的函数来说并不是那么好。如果您要在循环中调用 functionWithVariableReturnSize(),您最终会将所有返回值保存在堆栈帧中,直到该帧退出。这可能是不可取的,即使它符合某些用例,也可能不是一个好主意。

关于c - 调用约定会阻止可变大小的返回值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51254717/

相关文章:

c - 这实际上是动态内存分配吗?

可变长度数组的代码顺序

c - 将带有文件描述符的文本文件读取到管道中

c - 在c中的sprintf语句中填充+ve和-ve数字

c - 索引以获取结构的访问成员。 C编程

assembly - 什么是被调用者和调用者保存的寄存器?

c - 交换 2 个连续字符串 - 时间复杂度

assembly - 什么是功能尾声和序言?

c - 理解 C 反汇编调用

c - 数组类型和使用 malloc 分配的数组之间的区别