我知道如果我们使用类,结构等构建我们的程序会有很大的帮助,但它在运行速度方面是否有帮助我们避免使用这些结构并根据基本的C++语法编写代码?
例如,我正在尝试编写一个适用于矢量的程序.现在,编写类向量并定义其类似于set_at_index(int i)设置i此向量的特定行的值的方法听起来很诱人.此外,我可以检查相关矢量的长度是否i<=N在哪里N.
我的困惑在于,使用这些例程,每个set_at_index使用的方法都需要一个"if"语句.因此,如果我希望我的代码运行得更快,我应该避免它并继续声明一个数组并手动注意没有内存泄漏?
有没有什么方法可以检查内存泄漏而不会增加代码速度的负担?
是的,边界检查将花费更多的时间.但是,如果代码运行28894389375次,那么它将花费很少的额外时间,然后它可能会加起来一毫秒.请注意,std::vector如果使用at成员函数,则仅执行边界检查,而不是在使用时执行operator[].此外,如果您正在执行任何操作,例如写入文件或将文本打印到控制台,那么执行该操作可能需要花费超过一千万个边界检查数组访问的时间,因为I/O相对非常慢.
通常,没有边界检查使用类的代码将以与使用普通数组的代码相同的速度运行.像你建议的那样手动管理内存的问题是很容易忘记清理它,或者只通过程序中的一条执行路径来清理它,或者在发生异常时无法清理它.这真的很不值得.此外,使用没有边界检查的矢量类也同样快,因为它将使用没有边界检查的动态数组.无论如何都要付钱.
我还建议使用std::vector而不是编写自己的vector类,因为它们几乎可以完成你自己可以做的每一个优化,并且它们通常具有能够为其特定编译器编写代码的优势,并且可能能够利用那些只有那个编译器才能这样做,因为他们知道更多的实现 STL课程也经过专家(通常)的严格测试和编写.
您应该首先编写代码,然后使用分析器进行测量,以查看代码中的瓶颈(如果它还不够快),然后优化瓶颈.我敢打赌,检查数组的边界可能不会成为这些瓶颈之一.
可以使用valgrind之类的工具检查内存泄漏.你不要在代码本身中这样做.