c++ day 6

昨天小偷了个懒 今天好好搞回来

今天还要复习一个概念知识,我这里只是记录我学习过程中的点子。

程序性能分析

我们先来看一个小故事 故事由chatgpt生成

 

时间复杂度和空间复杂度是分析算法效率和资源消耗的重要指标。

让我们逐一了解这两个概念。

时间复杂度是衡量算法执行所需时间的度量。它表示算法执行所需的操作次数与问题规模的增长率之间的关系。通常使用大O记法来表示时间复杂度。

常见的时间复杂度包括:

  • O(1):常数时间复杂度,表示算法的执行时间与问题规模无关,是最理想的情况。
  • O(log n):对数时间复杂度,通常出现在使用分治或二分法的算法中,问题规模每次减少一半。
  • O(n):线性时间复杂度,算法的执行时间与问题规模成线性关系。
  • O(n log n):线性对数时间复杂度,常见于排序算法如快速排序和归并排序。
  • O(n^2):平方时间复杂度,通常出现在嵌套循环的算法中。
  • O(2^n):指数时间复杂度,通常出现在穷举所有可能的算法中,问题规模每次增加一倍。

除了上述常见的时间复杂度,还有其他更高阶的时间复杂度。理解时间复杂度的含义和计算方法,可以帮助你评估算法的执行效率,并选择合适的算法来解决问题。

空间复杂度是衡量算法在执行过程中所需的额外内存空间的度量。它表示算法所使用的额外空间与问题规模的增长率之间的关系。同样,也使用大O记法来表示空间复杂度。

常见的空间复杂度包括:

  • O(1):常数空间复杂度,算法所需的额外空间是固定的,与问题规模无关。
  • O(n):线性空间复杂度,算法所需的额外空间与问题规模成线性关系。
  • O(n^2):平方空间复杂度,通常出现在需要二维数组或矩阵存储的算法中。

在分析空间复杂度时,需要考虑算法使用的数据结构、递归调用、临时变量等因素。理解算法的空间复杂度可以帮助你合理管理内存资源,并避免不必要的内存消耗。

通过对算法的时间复杂度和空间复杂度进行分析,你可以评估算法的效率和资源消耗,并选择最合适的算法来解决问题。同时,了解这些概念也有助于优化算法,提高程序的性能。

空间复杂度

空间复杂度的组成

  1. 指令空间(Code Space): 指令空间是用来存储程序指令的内存空间。它包含了程序的机器指令、函数代码和其他执行指令所需的数据。指令空间通常在程序加载到内存时被分配,并且在程序执行期间保持不变。

  2. 数据空间(Data Space): 数据空间用于存储程序运行时所需的数据。这包括静态数据、全局变量、常量、静态分配的数据结构等。数据空间的大小在程序运行期间可能会发生变化,取决于程序的逻辑和数据的使用情况。

  3. 环境栈空间(Stack Space): 环境栈空间是用于存储函数调用、局部变量和函数执行上下文的内存空间。每当一个函数被调用时,会在环境栈上为该函数分配一段内存空间,用于保存函数的参数、局部变量和返回地址等。随着函数的嵌套调用和递归调用,环境栈会动态地增长和收缩。

让我们通过一个简单的示例代码来详细解释每个空间的含义。

#include <iostream>

int global_var = 10;

void myFunction(int parameter) {
  int local_var = 20;
  int* dynamic_var = new int(30);

  // 打印各个变量的地址
  std::cout << "Address of global_var: " << &global_var << std::endl;
  std::cout << "Address of local_var: " << &local_var << std::endl;
  std::cout << "Address of dynamic_var: " << dynamic_var << std::endl;
}

int main() {
  int main_var = 40;

  myFunction(50);

  return 0;
}

结果不唯一:

Address of global_var: 0x7ff6af133010
Address of local_var: 0x5160fff614
Address of dynamic_var: 0x223b6551a60

现在,我们逐个解释这些空间的含义:

  1. 指令空间:指令空间是用于存储程序指令的内存空间。它包含了程序的机器指令和函数代码。在上述代码中,编译器会将 main 函数和 myFunction 函数的机器指令存储在指令空间中。这部分空间通常在程序加载到内存时被分配,且在程序执行期间保持不变。

  2. 数据空间:数据空间用于存储程序运行时所需的数据。这包括静态数据、全局变量和常量等。在示例代码中,global_var 是一个全局变量,它被存储在数据空间中。数据空间的大小在程序运行期间保持不变,取决于程序中定义的数据类型和变量。

  3. 环境栈空间:环境栈空间用于存储函数调用、局部变量和函数执行上下文。每当一个函数被调用时,会在环境栈上为该函数分配一段内存空间。在示例代码中,当 main 函数被调用时,会在环境栈上分配一段内存空间用于存储 main_var。当 myFunction 函数被调用时,会在环境栈上分配一段内存空间用于存储 parameterlocal_var 和函数的返回地址。

以上述代码为例,打印的变量地址可能是不同的,但是可以通过观察地址的相对关系来更好地理解这些空间。全局变量 global_var 的地址是固定的,它存储在数据空间中。局部变量 local_var 和动态分配的变量 dynamic_var 的地址在每次函数调用时都会有所变化,它们存储在环境栈空间中。

 

posted @ 2023-07-10 22:08  芜湖大厨师  阅读(7)  评论(0编辑  收藏  举报