编译std :: vector的时间触发范围检查

Bau*_*gen 11 c++ vector c++11

目标:

我想为我的调试版本提供范围检查版本的std::vectors 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中使用宏定义来简单地打开和关闭它们.

问题:

  1. 有更好的解决方案吗?(如果没有,为什么不呢?)
  2. 如果没有,上述其中一项是否可以接受?(我知道这个是基于意见的,如果可能,请关注第1号.)

Jam*_*nze 12

如果我没有弄错,这是Visual Studio的常见情况.使用g ++,您必须使用-D_GLIBCXX_CONCEPT_CHECKS -D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTIC.(很可能你不需要全部三个,但我系统地使用这三个.)对于其他编译器,请查看文档.标准中未定义行为的目的正是为了允许这种事情.