【发布时间】:2021-12-26 06:17:26
【问题描述】:
考虑:
void largestackallocation() {
double a[10000000];
}
int main() {
return 0;
}
在使用 MSVC(Cl.exe 和 MSBuild.exe)进行编译时,会发出警告 C6262,建议将分配移动到堆而不是堆栈。编译处于发布模式,具有以下选项:
/permissive- /ifcOutput "x64\Release\" /GS /GL /W3 /Gy /Zc:wchar_t /I"E:\local\boost_1_72_0" /Zi /Gm- /O2 /sdl /Fd"x64\Release\vc142.pdb" /Zc:inline /D "_MBCS" /errorReport:prompt /WX- /Zc:forScope /Gd /Oi /MD /FC /Fa"x64\Release\" /EHsc /nologo /Fo"x64\Release\" /FA /Fp"x64\Release\windows.pch" /diagnostics:column
在 gcc 上,使用发布模式构建,甚至可以将警告转换为错误:
g++ -c -O2 -Werror -MMD -MP -MF "build/Release/GNU-Linux/_ext/511e4115/largestackallocation.o.d" -o build/Release/GNU-Linux/_ext/511e4115/largestackallocation.o ../src/largestackallocation.cpp
mkdir -p dist/Release/GNU-Linux
不会发出警告/错误。使 gcc/g++ 在潜在的大堆栈分配上发出警告的选项/设置是什么?
【问题讨论】:
-
gcc 有一个
-Wstack-usage=<limit>选项。例如,如果函数堆栈使用量超过 255 个字节,-Wstack-usage=255将发出警告。选择一个您认为适当保守的限制。完成的计算是保守的(即有时可能会高估函数的堆栈使用量),但也允许动态堆栈分配(VLA、alloc()等)。 -
@Peter 我只是在检查,然后我也没有收到警告:godbolt.org/z/9n6j56h89
标签: c++ gcc g++ gcc-warning