C 中的可移植函数(无汇编)returns 其堆栈帧的大小

Portable function in C (with no assembly) that returns the size of its stack frame

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

int stackframe_size()
{

}

尝试如下解决 - 这个函数 returns 228 字节,当用 VS 2010 编译时。有没有办法验证它的正确性?

    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;
    }

I wanted to check if there is a clever/cleaner way to do this without adding local variables

您可以使用 &run 而不是 &i - 这样可以节省局部变量。

Is there a way to verify its correctness?

使用调试器!在您关心的位置检查堆栈指针寄存器,观察溢出发生等。

不可能有这样的便携式功能。

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

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

在 "stack frames" 被压入和弹出的连续内存区域的意义上,存在不使用 "stack" 的真实世界 C 实现。 (在先进后出数据结构的意义上必须有一个 "stack",但是 "stack" 的实现方式完全未指定。)一些 IBM 大型机实现,例如,分配通过堆之类的函数调用的内存,因此两个这样的调用的局部变量地址之间没有定义的关系。

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