【发布时间】:2021-12-25 20:17:35
【问题描述】:
上面提到的 GCC 标志给我带来了一些困惑。
Here 它说如下:
-Wstack-usage=字节大小
如果函数的堆栈使用量可能超过字节大小,则发出警告。确定堆栈使用情况的计算是保守的。在确定是否发出警告时,编译器会包含通过 alloca、可变长度数组或相关构造分配的任何空间。
那么“确定堆栈使用情况的计算是保守的。”是什么意思?
我链接了一个用 C++ 编写的小程序,并特意使用-Wstack-usage=1 来查看各种函数的警告和堆栈使用情况。
一些警告信息如下所示:
Util.cpp: In function 'getCharInput.constprop':
Util.cpp:113:6: warning: stack usage is 64 bytes [-Wstack-usage=]
113 | void util::getCharInput( char* const inputBuffer, const std::streamsize streamSize )
| ^
Main.cpp: In function 'main':
Main.cpp:10:5: warning: stack usage is 112 bytes [-Wstack-usage=]
10 | int main( )
| ^
为什么main 的堆栈使用量只有 112 字节,尽管它调用了所有其他函数?在被调用者返回并从main 的堆栈帧中删除之前,它不会将被调用者保留在其堆栈帧上吗?不过我可能有错误的知识。
【问题讨论】:
-
我们应该猜不到您的代码吗?
-
@S.M.代码很小,但仍可能超过 2000 LOC。你希望我如何展示它?如果你真的需要看的话,去here。
-
@digito_evo 看到这个:minimal reproducible example
-
@S.M.所以我想我可能以错误的方式理解了一些东西。因为少数函数有 240、912 等堆栈使用。他们被
main调用过一次,这就是我感到困惑的原因。我猜链接器不会检查每个函数的调用堆栈,而只是报告每个函数自己范围的大小。 -
@Kamil,不,这不是它的意思。说它是“保守的”意味着它倾向于高估堆栈使用量,因此如果估计存在不确定性,它更有可能发出警告。
标签: c++ gcc x86-64 stack-memory gcc-warning