-Wstack-usage=GCC 中的字节大小
-Wstack-usage=byte-size in GCC
上面提到的 GCC 标志让我有些困惑。
Here 内容如下:
-Wstack-usage=byte-size
Warn if the stack usage of a function might exceed byte-size. The computation done to determine the stack usage is conservative. Any space allocated via alloca, variable-length arrays, or related constructs is included by the compiler when determining whether or not to issue a warning.
那么 “为确定堆栈使用而进行的计算是保守的。” 是什么意思?
我链接了一个用 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字节?在被调用者 returns 并从 main
的堆栈帧中删除之前,它不会将被调用者保留在其堆栈帧中吗?虽然我可能有错误的知识。
Why the stack usage of main is only 112 bytes despite that it calls all the other functions?
堆栈使用由 GCC 计算 仅用于此函数。这也在文档中:“如果堆栈使用 函数 可能超过字节大小,则发出警告”。
Doesn't it keep the callee on its stack frame until the callee returns and gets deleted from the stack frame of main?
是的,所以当执行该代码时就会发生。 GCC 不会静态地遍历整个调用堆栈。它只是为一个特定函数计算堆栈使用,并检查该单个特定函数的使用是否大于某个阈值。
上面提到的 GCC 标志让我有些困惑。
Here 内容如下:
-Wstack-usage=byte-size
Warn if the stack usage of a function might exceed byte-size. The computation done to determine the stack usage is conservative. Any space allocated via alloca, variable-length arrays, or related constructs is included by the compiler when determining whether or not to issue a warning.
那么 “为确定堆栈使用而进行的计算是保守的。” 是什么意思?
我链接了一个用 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字节?在被调用者 returns 并从 main
的堆栈帧中删除之前,它不会将被调用者保留在其堆栈帧中吗?虽然我可能有错误的知识。
Why the stack usage of main is only 112 bytes despite that it calls all the other functions?
堆栈使用由 GCC 计算 仅用于此函数。这也在文档中:“如果堆栈使用 函数 可能超过字节大小,则发出警告”。
Doesn't it keep the callee on its stack frame until the callee returns and gets deleted from the stack frame of main?
是的,所以当执行该代码时就会发生。 GCC 不会静态地遍历整个调用堆栈。它只是为一个特定函数计算堆栈使用,并检查该单个特定函数的使用是否大于某个阈值。