gpt4 book ai didi

c++ - 了解 MSVC++ 中的 "Buffer Security Check/GS"编译器选项

转载 作者:可可西里 更新时间:2023-11-01 15:38:19 24 4
gpt4 key购买 nike

我最近惊讶地注意到,在 MSVC++ 2010 中使用 /GS(启用缓冲区安全检查)进行编译似乎在某些情况下对运行时性能具有不可忽略的影响。有没有人有过这样的经历??

对于大型科学风格的应用程序(网格生成库),似乎使用 /GS- 进行编译可以使我的几个大型基准测试的运行时间提高近 10%测试套件(“大”是 >= 1 秒的运行时间)。 /GS 在 MSVC++ 2010 中的所有优化级别默认处于启用状态。

我必须承认,我以前从未过多关注过这个选项,我想澄清一下它的实际作用。在线documentation似乎广泛谈论字符串缓冲区,但由于我不在任何地方使用 stringchar[] 缓冲区,我一定遗漏了一些东西。

这段(来自在线文档)似乎表明我看到的性能下降有点不寻常:

A performance tradeoff for using security checks in an application must be made. The Visual C++ compiler team focused on making the performance degradation small. In most cases, the performance should not degrade more than 2 percent. In fact, experience has shown that most applications, including high-performance server applications, have not noticed any performance impact.

当然,我可以将其关闭并获得更快的代码,但我想在执行此操作之前了解其中的含义。

最佳答案

我和您有过相同的经历:/GS- 导致运行时间提高了约 10%。我在我的博客上分享了一些基准:The Cost of Buffer Security Checks in Visual C++

启用/GS 时(这是 VC++ 发行版配置的默认设置),似乎任何时候你创建一个 C 风格的数组作为局部变量,编译器都会插入一些额外的指令来确保后面的 4 个字节栈上的数组没有被修改。正如您所注意到的,它是 char 数组还是其他类型的数组似乎并不重要。我猜这个编译器选项背后的想法是任何堆栈缓冲区溢出都可能被黑客利用,无论类型如何。

但是,如果您正在开发一个不是网络服务的 Visual C++ 应用程序,并且您正在努力实现最高性能,例如在游戏、编辑器或基准测试工具中——并且它不太可能成为黑客的目标——那么我建议继续并禁用此选项。

关于c++ - 了解 MSVC++ 中的 "Buffer Security Check/GS"编译器选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6607410/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com