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
,其中 p0
和 p1
是指向不同对象的指针,具有未定义的行为。
除非您的代码减去 int
值,这些值是地址转换的结果。指针的直接减法更有可能起作用——指针应该是 char*
或 unsigned char*
类型。在许多实现中 int
太小而无法容纳转换后的指针,有些实现中指针的表示比您想象的更复杂,即使将它们转换为足够大的整数类型也不一定会给您有意义的结果.
在 "stack frames" 被压入和弹出的连续内存区域的意义上,存在不使用 "stack" 的真实世界 C 实现。 (在先进后出数据结构的意义上必须有一个 "stack",但是 "stack" 的实现方式完全未指定。)一些 IBM 大型机实现,例如,分配通过堆之类的函数调用的内存,因此两个这样的调用的局部变量地址之间没有定义的关系。
您或许可以用纯 C 语言(无需汇编语言)编写一个函数,为您提供特定实现堆栈帧的大小。但是由于C语言本身没有"stack frame"的概念(标准中甚至没有使用"stack"这个词),所以无法移植
用 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
,其中 p0
和 p1
是指向不同对象的指针,具有未定义的行为。
除非您的代码减去 int
值,这些值是地址转换的结果。指针的直接减法更有可能起作用——指针应该是 char*
或 unsigned char*
类型。在许多实现中 int
太小而无法容纳转换后的指针,有些实现中指针的表示比您想象的更复杂,即使将它们转换为足够大的整数类型也不一定会给您有意义的结果.
在 "stack frames" 被压入和弹出的连续内存区域的意义上,存在不使用 "stack" 的真实世界 C 实现。 (在先进后出数据结构的意义上必须有一个 "stack",但是 "stack" 的实现方式完全未指定。)一些 IBM 大型机实现,例如,分配通过堆之类的函数调用的内存,因此两个这样的调用的局部变量地址之间没有定义的关系。
您或许可以用纯 C 语言(无需汇编语言)编写一个函数,为您提供特定实现堆栈帧的大小。但是由于C语言本身没有"stack frame"的概念(标准中甚至没有使用"stack"这个词),所以无法移植