gpt4 book ai didi

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

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

目标:

我想为我的调试版本使用 std::vectoroperator [] 的范围检查版本,并且在 Release模式下不进行范围检查。

Debug模式下的范围检查显然有利于调试,但它会导致我的发布代码速度降低 5% - 10%,我希望避免这种情况。

可能的解决方案:

我在 Stroustrup 的“The C++ programming language”中找到了解决方案。他做了以下事情:

template <class T>
class checked_vector : public std::vector<T> {
public:
using std::vector<T>::vector;

//override operator [] with at()
};

这是有问题的,因为它继承自具有非虚拟析构函数的类,这很危险。 (还有 the Lounge was not too fond of that solution 。)

另一个想法是这样的类:

template <class T>
class checked_vector {
std::vector<T> data_;

public:
//put all public methods of std::vector here by hand

};

这既乏味又会产生大量的复制粘贴,这也很糟糕。

上述两种解决方案的好处在于,我可以使用我的 makefile 中的宏定义简单地打开和关闭它们。

问题:

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

最佳答案

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

关于c++ - std::vector 的编译时间触发范围检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24246017/

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