【问题标题】:How large will the stack frame of this function be in bytes?这个函数的堆栈帧有多大(以字节为单位)?
【发布时间】:2021-03-27 16:05:27
【问题描述】:
static void g(int v, int w) {
  int x, y, z;

  x= n * v;

}

函数 g() 的栈帧是多少字节?

【问题讨论】:

  • 这取决于编译器。可以是as low as zero
  • 可能为零,也可能是兆字节。由于“好像”规则,该功能可能已经被优化而不再存在,该规则允许实现做任何他们喜欢的事情,前提是根据标准,可观察的行为是相同的。事实上,ISO C 标准恰好 次提到“堆栈”这个词,因此堆栈甚至可能不存在。
  • 假设所有东西都使用了,会不会是 28?
  • Asznee,是的,它可以是 28。它也可以是任何其他非负整数 :-)
  • @paxdiablo 谁说返回地址在栈上? :-) gcc.godbolt.org/z/orobW3

标签: c stack


【解决方案1】:

因为它是static 并且很小,所以该函数可能会被内联到其他函数中,并且参数可能会在寄存器中。

但是,因为它什么都不做(x 中的计算值没有返回也没有使用,也没有副作用),整个函数更有可能被删除。

在任何一种情况下,对于所有健全的编译器(启用优化),它都不会使用任何堆栈。

【讨论】:

  • 假设所有东西都使用了,会不会是 28?
  • @AszneeJoneson 您没有指定int 的大小。哎呀,您甚至没有指定一个字节中有多少位。这些是不是固定值。
  • @AszneeJoneson:假设一切都已使用;那么它取决于编译器喜欢使用的调用约定(它可能不是标准的 ABI,因为它是 static)。如果使用标准 ABI;那么这取决于哪一个。例如,对于两个常见的 64 位 80x86 ABI;参数将在寄存器中传递,“返回地址”将消耗 8 个字节的堆栈,但堆栈将对齐到 16 个字节的边界;所以你可能希望它使用 16 字节的堆栈空间(忽略时髦的东西 - “阴影空间”或“红色区域”)。
  • @Brendan 另一方面,在寄存器丰富的 RISC 架构上,一切都可能在寄存器中,甚至返回地址。轻量级叶函数不消耗堆栈。另一方面,安全或调试器选项可能会引入金丝雀、帧指针、分析检查点和 who-knows-what-else。所以是的,可以是任何东西。
猜你喜欢
  • 1970-01-01
  • 2021-12-15
  • 2021-01-08
  • 1970-01-01
  • 1970-01-01
  • 2017-12-18
  • 1970-01-01
  • 2016-03-29
相关资源
最近更新 更多