Disabling bounds checking for c++ vectors

前端 未结 8 2285
囚心锁ツ
囚心锁ツ 2021-02-08 06:09

With stl::vector:

vector v(1);
v[0]=1; // No bounds checking
v.at(0)=1; // Bounds checking

Is there a way to disable bounds checking

相关标签:
8条回答
  • 2021-02-08 06:25

    If you have reasonably consistent access patterns (ie/ not random access), rather than using at() or [], one approach to avoid range checking is to use iterators, using begin(), end(), and advance() or even better, through the use of the standard algorithms.

    Although this doesn't solve the underlying problem of correcting at() doing range checking some implementations of the standard library (MSVC) have checked iterators for some types of builds

    0 讨论(0)
  • 2021-02-08 06:26

    No. The bounds-checking of std::vector::at is specified by the standard, and there is no standard-conforming C++ implementation that can deviate from that.

    0 讨论(0)
  • 2021-02-08 06:30

    Based on your comment that you would like to turn on/off bounds checking, you could use a wrapper template function:

    template <class T>
    inline typename T::reference deref(T &cont, typename T::size_type idx)
    {
    #if BOUNDS_CHECK
        return cont.at(idx);
    #else
        return cont[idx];
    #endif
    }
    
    template <class T>
    inline typename T::const_reference deref(const T &cont, typename T::size_type idx)
    {
    #if BOUNDS_CHECK
        return cont.at(idx);
    #else
        return cont[idx];
    #endif
    }
    

    You would have to modify your code to enable this, but once you had it in place you could turn bound checking on or off as you wish.

    I do admit that it looks a bit ugly to use:

    deref(vec, 10) = ...;
    
    0 讨论(0)
  • 2021-02-08 06:35

    Not a standard way. You could turn off exceptions in your compiler. You can do this with gcc with -fno-exceptions.

    You should be wary of doing this though; your libraries (including the standard libraries) might not play nicely with exceptions turned off. Check your documentation, and threads like this one on the gcc mailing list.

    0 讨论(0)
  • 2021-02-08 06:38

    If you really want to do it (at least for a quick and dirty profiling comparison), this will work if you have no other at()s

    #define at(x) operator[](x)
    

    And if you want to keep at() for development and use operator[] in production, just wrap it in an #ifdef.

    And if you do have other at()s you can always edit your #included <vector> file.

    0 讨论(0)
  • 2021-02-08 06:43

    Maybe a better solution is to use [] and use checked implementation of the standard library for debug.

    0 讨论(0)
提交回复
热议问题