gpt4 book ai didi

c - C 中的可移植函数(没有程序集)返回其堆栈帧的大小

转载 作者:太空狗 更新时间:2023-10-29 15:26:21 25 4
gpt4 key购买 nike

用 C 编写一个可移植函数(没有汇编),返回其栈帧的大小

int stackframe_size()
{

}

尝试如下解决 - 当使用 VS 2010 编译时,此函数返回 228 字节。有没有办法验证其正确性?

    int stackframe_size(int run)
{
int i ;

if(!run)
{
return ((int)(&i) - stackframe_size(++run));

}
return (int)(&i);

}

调用为:

    int main()
{
printf("\nSize of stackframe_size() is: %d bytes",stackframe_size(0)) ;
return 0;
}

最佳答案

这样的便携功能是不可能的。

您的尝试可能与您所能获得的接近,但指针减法具有未定义的行为。更一般地说,p1 - p0,其中 p0p1 是指向不同对象的指针,具有未定义的行为。

除了您的代码减去地址转换结果的 int 值。指针的直接减法更有可能起作用——指针应该是 char*unsigned char* 类型。在许多实现中,int 太小而无法容纳转换后的指针,而在某些实现中,指针的表示形式比您想象的要复杂,即使将它们转换为足够大的整数类型也不一定会给您带来好处一个有意义的结果。

现实世界中的 C 实现不使用“堆栈”,即在其上推送和弹出“堆栈帧”的连续内存区域。 (在先进后出数据结构的意义上必须有一个“堆栈”,但“堆栈”的实现方式完全未指定。)一些 IBM 大型机实现,例如,为函数分配内存通过类似堆的方式调用,因此两个此类调用的局部变量地址之间没有定义的关系。

您或许可以用纯 C 语言(无需汇编语言)编写一个函数,它为您特定实现 提供堆栈帧的大小。但是由于C语言本身没有“栈帧”的概念(标准中甚至没有使用“栈”这个词),所以无法移植。

关于c - C 中的可移植函数(没有程序集)返回其堆栈帧的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28358213/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com