代码膨胀是产生不必要的时间长,速度慢或以其他方式浪费资源的代码。这是软件开发中的一个问题,它不必要地延长了软件代码的长度。因此,为了编写高质量的代码,我们始终避免在程序中膨胀代码。
以下是代码膨胀的一些原因:
- 标头:假设我们已经在标头文件中声明了一些函数,如下所示:
#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的值。有多种技术可以克服此问题。标头的问题也适用于模板,因为模板几乎总是在标头文件中定义。有两种方法可以解决此问题:
- 在源文件中定义模板函数并显式实例化它们。
- 在标头中使用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等的更多准备工作,请参阅“完整面试准备课程” 。