📜  C++中的代码膨胀与示例

📅  最后修改于: 2021-05-30 16:35:14             🧑  作者: Mango

代码膨胀是产生不必要的长,慢或浪费资源的代码。这是软件开发中的一个问题,它不必要地延长了软件代码的长度。因此,为了编写高质量的代码,我们始终避免在程序中膨胀代码。

以下是代码膨胀的一些原因

  • 标头:假设我们已经在标头文件中声明了一些函数,如下所示:
    #include 
      
    // Function to find the sum of elements
    // in a vector
    inline int findSum(vector& arr, int N)
    {
        int sum = 0;
        for (int i = 0; i < N; i++) {
            sum += arr[i];
        }
        return sum;
    }
      
    struct GfG {
      
        // Declare vector arr
        std::vector arr;
      
        // Function
        int execute() const
        {
            return findSum(arr, arr.size());
        }
    };
    

    在上面的头文件中,每次我们在任何源代码中单独使用以上头文件时,函数execute()findSum()都会同时编译。如果我们包含任何头文件并且不使用该头文件中的任何函数,它每次仍将编译头文件的功能和所有其他功能,这会减慢每个软件的构建时间。当项目很大时,它将包含数百个源文件,并且头文件中定义的每个函数被编译数百次。编写用于软件开发的代码的这种做法会导致代码膨胀,即不必要地声明功能。

  • 范本:
    在C++中,我们具有用于函数和容器的内置模板。模板是具有不同数据类型的功能的通用形式。模板的每个实例都是由编译器生成的完全独立的代码段。
    考虑下面的模板示例:
    template 
    T findSum(const T* arr, int num)
    {
        return accumulate(arr, arr + num, T(0));
    }
      
    template 
    struct GfG {
        T arr[N];
        T run() const
        {
            T res = 0;
            for (int i = 0; i < N; i++)
                res += arr[i];
            return res;
        }
    };
    

    在上述模板函数,每种使用的模板参数T的类型都会对findSum()进行一次编译。
    GfG :: run()中的函数被编译的次数与不同的次数相同对,调用了run()方法。此函数可能需要更多时间来更改N的值。有多种技术可以克服此问题。标头的问题也适用于模板,因为模板几乎总是在标头文件中定义。

    有两种方法可以解决此问题:

    1. 在源文件中定义模板函数并显式实例化它们。
    2. 在标头中使用extern模板声明,并在源文件本身中使用显式模板实例化。

程序:

#include 
using namespace std;
  
// Driver Code
int main()
{
    // Code Bloating
    string str("GeeksForGeeks");
  
    // Print string str
    cout << str << endl;
    return 0;
}
输出:
GeeksForGeeks

上面的程序将完美运行,并将打印GeeksForGeeks 。但是主函数的第一行在上面的程序中有一个代码膨胀的问题。上面程序的议程是打印字符串GeeksForGeeks ,那么为什么我们要创建字符串类的对象,因为它会导致创建字符串类对象。
我们可以简单地写

cout << "GeeksForGeeks" << endl; 

代码膨胀的影响:

  • 它不必要地创建某些类的对象,这会使我们的软件执行缓慢。
  • 这是软件开发中的一个问题,它不必要地延长了软件的代码长度。
想要从精选的最佳视频中学习和练习问题,请查看有关从基础到高级C++的C++基础课程以及有关语言和STL的C++ STL课程。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”