目标:
我想为我的调试版本提供范围检查版本的std::vector
s operator []
,并且在发布模式下没有范围检查.
调试模式下的范围检查显然对调试有好处,但是在我的发布代码中导致速度减慢5% - 10%,我想避免.
可能的解决方案:
我在Stroustrup的"The C++编程语言"中找到了一个解决方案.他做了以下事情:
template <class T>
class checked_vector : public std::vector<T> {
public:
using std::vector<T>::vector;
//override operator [] with at()
};
Run Code Online (Sandbox Code Playgroud)
这是有问题的,因为它继承自具有非虚拟析构函数的类,这是危险的.(并且休息室 不太 喜欢那个解决方案.)
另一个想法是这样的类:
template <class T>
class checked_vector {
std::vector<T> data_;
public:
//put all public methods of std::vector here by hand
};
Run Code Online (Sandbox Code Playgroud)
这既繁琐又会产生大量的复制粘贴,这也很糟糕.
上述解决方案的优点在于我可以在makefile中使用宏定义来简单地打开和关闭它们.
问题:
Jam*_*nze 12
如果我没有弄错,这是Visual Studio的常见情况.使用g ++,您必须使用-D_GLIBCXX_CONCEPT_CHECKS -D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTIC
.(很可能你不需要全部三个,但我系统地使用这三个.)对于其他编译器,请查看文档.标准中未定义行为的目的正是为了允许这种事情.