我还注意到条件断点很昂贵,并且得出的结论与您相同。我无法想象禁用断点会导致任何减速的任何原因,因为我希望它只是一个编辑器,是在需要时打开断点的快捷方式。
当我遇到像你这样的情况时,我会做一个断言宏。(你可以使用visual studio提供的assert宏,但我不喜欢)。让您的宏检查您想要的条件,然后在失败时调用DebugBreak 。在应用程序的发布或未经检查的构建中,断言评估为空,因此您的代码不会受到影响。
一个简单的断言宏可以如下所示:
#ifdef _DEBUG
#define assert(x)\
do{\
if(!(x)){DebugBreak();}\
}while(0)
#else
#define assert(x)
#endif
并称之为:
assert(pValue != NULL && "A bad parameter was passed to the function");
您可以在 DebugBreak 之前在失败中添加更多代码(例如使用 #x 打印失败的条件,和/或使用 ____FILE____ 和 ____LINE____ 打印行/文件号,以便您可以双击消息)。您可以使用OutputDebugString将消息写入调试日志,甚至可以检查是否使用IsDebuggerPresent附加了调试器以进一步定制您的断言。我还喜欢使用 && 字符串格式来提供有关特定断言的更多信息。
使用 assert 时需要注意一些事项。首先,不要在宏中放置任何必须运行的代码,因为它会在非调试版本中被剥离。出于同样的原因,不要放入有副作用的代码。此外,您不希望在未附加调试器时调用 DebugBreak(),因为它本质上会引发异常,如果未捕获该异常,将终止应用程序。