[C++刷题] 底子小知识点(7) 将大数组等 移动到 main 函数外 ...

打印 上一主题 下一主题

主题 1838|帖子 1838|积分 5514

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
在我们刷题时, 经常会举行开发大数组等操纵,而初学者一样平常风俗性将变量声明放在main函数中。
而在main()函数中声明的变量假如太大, 如int arr[10000][5],偶然编译器会报错:
   警告 C6262 函数使用堆叠的 "24020"字节。请考虑将一些数据移动到堆。
  将大数组移动到 main 函数外 是一种常见的优化手段,但效果取决于详细环境

缘故原由


  • 栈区与全局区的差异

    • 栈区

      • 每个函数调用分配的内存,通常空间较小(典型限制在几 MB 内)。
      • 凌驾限制会导致 栈溢出

    • 全局区(静态区)

      • 程序运行时分配,生命周期贯穿整个程序。
      • 空间通常更大,由系统负责管理。

    将数组移到全局区,可以减轻栈的负担,制止栈溢出。

  • 为什么编译器会报错

    • 当一个函数内定义了 较大的数组(例如上万乃至更大),会占用过多的栈空间,编译器会提示移动到堆或全局区。


是否有效

将数组从函数内部移动到函数外,全局区管理的内存空间通常更大,因此可以解决栈空间不敷的题目。以下环境有效:

  • 全局声明的数组大小不凌驾全局区限制

    • 全局区(包括全局变量和静态变量)空间的限制通常大于栈区,可以分配较大内存。
    • 示例:
      1. const int SIZE = 1000000;
      2. int arr[SIZE]; // 声明在全局区
      3. int main() {
      4.     // 使用 arr
      5. }
      复制代码

  • 不须要动态分配的环境下

    • 假如数组大小是固定的,且贯穿整个程序生命周期,全局数组是简便的解决方法。


堆区 vs 全局区

堆区 是另一种选择,通过动态内存分配解决栈不敷题目:
  1. int* arr = new int[SIZE]; // 动态分配大数组
复制代码
堆与全局的对比:
特性全局区堆区分配时机程序加载时程序运行时生命周期整个程序运行期间用户手动管理(delete)灵活性固定大小,必须编译时确定可动态调解大小空间限制全局区空间较大堆空间通常比全局更大 假如数组大小较大且须要灵活管理,发起使用堆。

总结


  • 全局区实用场景

    • 数组大小固定,贯穿整个程序生命周期。
    • 内存不须要动态开释。
    • 示例:
      1. int arr[1000000]; // 全局区声明
      2. int main() {
      3.     // 使用 arr
      4. }
      复制代码

  • 堆区实用场景

    • 数组大小需动态分配。
    • 数据使用完后可以动态开释,淘汰内存占用。
    • 示例:
      1. int* arr = new int[1000000]; // 动态分配
      2. // 使用 arr
      3. delete[] arr; // 动态释放
      复制代码

  • 假如数组较小且只在函数中使用,栈空间更高效。否则,移动到全局或堆区是解决栈空间不敷的有效方法

这也是我们经常看到题解中风俗将变量声明为全局变量的缘故原由。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

乌市泽哥

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表