<程序存储空间分配>|| Linux platform C/C++ 可定义数组的最大长度

先公布结论:

当数组存储于栈区时,最大长度受 Linux 为每个程序分配的最大栈区空间限制 —— Linux stack max size = 8 MB
当数组存储于非栈区时,最大长度只受当前计算机的剩余可用内存的限制

============== ┗|`O′|┛ 嗷~~ ===============
以下分析,就是讨论上述结论如何一步一步推导出来的!
《<程序存储空间分配>|| Linux platform C/C++ 可定义数组的最大长度》

重点关注:stack size -> (kbyte, -s) 8192
以上我们已经知道了 Linux 中一个程序的最大栈区大小为 8192 KB -> 8 MB

【一图胜千言系列 】
《<程序存储空间分配>|| Linux platform C/C++ 可定义数组的最大长度》

text: 存放程序代码正文,以及只允许读的只读常量,eg:"hello world"
data: 存放初始化的数据,如:手动初始化的全局变量和 static 变量
bss:  存放为初始化的数据,如:未初始化的全局变量和 static 变量
heap: 存放 程序员 手动申请的内存空间,申请和释放都交由程序员自行管理
stack: 存放程序中的临时变量
空闲空间:就是程序在启动时,OS 为程序分配的空间中暂时尚未使用的部分

完善几点:
1. 代码正文分 -> 常量区、函数区
    函数区也就是我们所编写的函数主题,当然包含 main() 啦

OK,前导知识已经补充完毕,下面进行正题:
我们要想知道在 Linux 环境下,程序中可以申请的数组的最大长度,就要先知道,这个数组会被存放在哪里!

在下面的情况中,char 数组 和 int 数组 都是位于 main 函数中,
所以说,它们都是临时变量 –> 存储在 stack 区。

在根据上面的第一幅图,可以知道,Linux 下 stack size 最大为 8 MB。

<1> 如果是 char 类型数组
char = 1 byte(字节)    ||  8 MB = 8 * 1024 * 1024 * 1024 * sizeof(char)
具体的测试结果见下面代码

<2> 如果是 int 类型数组
int = 4 byte(字节)     ||  8 MB = 2 * 1024 * 1024 * 1024 * sizeof(int)
具体的测试结果见下面代码

所以说:
数组的最大长度受 Linux 可以为每个程序分配的最大栈区空间的大小限制!

One more thing:
我们上面讨论的都是当 数组 是临时变量的情况——也就是当数组位于栈区的情况下,
如果 数组 位于其他区呢?例如:data bss heap。
答案是:数组的大小的上限将取决于计算机当前剩余可用内存

emmm,这样说咱好像有点太绝对了,毕竟咱尚未考究过 Windows 上是否对 全局静态区 施加有最大内存大小的限制。
不过如果想要测试,方法也不是很困难,只要按照上述的步骤,不断扩大全局变量的大小,来以此试探内存边界。

#include <cstring>

int main()
{ 
    /* Linux stack size: MAX(8192 -> 8 MB) */

    /* 1 char = 1 byte */
    // char _list[1024] = ""; // 1024 byte = 1 KB OK
    // char _list[1024 * 1024] = ""; // 1024 * 1024 = 1 MB OK
    // char _list[1024 * 1024 * 1024] = ""; // 1024 * 1024 * 1024 = 1 GB Error
    // char _list[8 * 1024 * 1024] = ""; // 8 * 1024 * 1024 = 8 MB Error
    // char _list[2 * 1024 * 1024] = ""; // 2 * 1024 * 1024 = 2 MB OK
    // char _list[7 * 1024 * 1024] = ""; // 7 * 1024 * 1024 = 7 MB OK

    /* 1 int = 4 byte */
    // int _list[1024]; // 1024 byte = 1 KB OK
    // int _list[1024 * 1024]; // 1024 * 1024 = 1 MB OK
    // int _list[1024 * 1024 * 1024]; // 1024 * 1024 * 1024 = 1 GB Error
    // int _list[8 * 1024 * 1024]; // 8 * 1024 * 1024 = 8 MB Error
    // int _list[2 * 1024 * 1024]; // 2 * 1024 * 1024 = 2 MB Error
    int _list[1 * 1024 * 1024];             // 1 * 1024 * 1024 = 1 MB OK

    memset((void *)_list, 0, sizeof(_list));

    return 0;
}

查阅的相关资料:
UNIX 环境高级编程(第3版) – 第7章 进程环境 – C程序的存储空间分配
linux中c/c++数组的最大长度_XSunrise的专栏-CSDN博客_c++数组最大长度
C/C++程序内存分布_风居住的城市-CSDN博客_c++内存分布
程序运行时的内存空间分布_ljianhui的专栏-CSDN博客_程序运行内存

题外话:
既然咱探讨了 Linux platform C/C++ 可定义数组的最大长度,
那回过来,再看看下 C++ 中 std::string::max_size() 到底有多呗

多平台测试:(结果如下)
Win_MinGW32_GNU
std::string::max_size() = 1073741823 -> [ 2^30 ] (0 ~ 1073741823)

Win_VS_32
std::string::max_size() = 2147483647 -> [ 2^31 – 1 ] (0 ~ 2147483647)
Win_VS_64
std::string::max_size() = 9223372036854775807 -> [ 2^63 – 1 ] (0 ~ 9223372036854775807)

Linux_GNU_64
std::string::max_size() = 9223372036854775807 -> [ 2^63 – 1 ] (0 ~ 9223372036854775807)

知道这些也不干啥,咱就是比较好奇啦

One more thing:
在 www.cpluscplus.com 上发现的一个迷惑结果:
它上面展示的 string::max_size() 竟然等于 2^32 – 5 …🤔奇怪奇怪

《<程序存储空间分配>|| Linux platform C/C++ 可定义数组的最大长度》
《<程序存储空间分配>|| Linux platform C/C++ 可定义数组的最大长度》
《<程序存储空间分配>|| Linux platform C/C++ 可定义数组的最大长度》
《<程序存储空间分配>|| Linux platform C/C++ 可定义数组的最大长度》
《<程序存储空间分配>|| Linux platform C/C++ 可定义数组的最大长度》

    原文作者:TracerSAO
    原文地址: https://blog.csdn.net/qq_43483263/article/details/112210268
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞