使用 size_t 声明最大数组

2023-12-03

我想声明一个非常大的数组。我发现数组的最大大小是size_t,它被定义为UINT_MAX

所以我写了这样的代码

int arr[UINT_MAX];

当我编译这个时,它说数组维度溢出

但是当我这样写的时候

size_t s = UINT_MAX;
int arr[s]; 

它可以正确编译。 有什么不同


第一个错误:size_t不一定unsigned int,因此它的最大值可以不同于unsigned int (UINT_MAX);此外,在 C++ 中获取有关您应该使用的类型的限制的信息std::numeric_limits.

#include <limits>

size_t s=std::numeric_limits<size_t>::max();

第二个错误:你永远不会得到这么大的数组;自从size_t需要能够表达任何对象的最大大小,它可能应该足够大以表达与应用程序可用的整个地址空间一样大的对象,但是尝试分配这么大的对象将需要专用whole地址空间给它,这是不可行的;此外,您正在请求一系列int这么大,这意味着它将是UINT_MAX*sizeof(int)字节大,这可能大约是整个地址空间的 4 倍 - 显然是胡说八道 - 顺便说一句sizeof(arr)将无法表达此类对象的大小,并且通常指针甚至无法到达该数组的顶部。编译器会检测到这些错误并阻止您这样做。

此外,我推断您正在尝试在堆栈上分配该内容,该内容通常比应用程序可以使用的所有内存小得多,并且一般来说,在那里分配大数组并不是一个好主意(您应该使用堆)。

第三个错误:分配所有内存没有意义。如果你有很大的内存需求,你应该在堆上分配东西,而不是在堆栈上,并且只分配与操作系统和其他应用程序一起运行所需的内存(如果你正在工作,最后一个考虑因素不适用)在嵌入式系统上,您是唯一正在运行的应用程序)。

C++ 中的第二个片段甚至不应该工作,因为,如果该东西在堆栈上分配,那么您将变得非标准,因为它将是一个 VLA(在 C99 中可用,但被当前和下一个 C++ 标准强烈拒绝) 。然而,在这种情况下,分配该数组的代码是在运行时使用的(VLA 通常在维度上不固定),因此对编译器的检查并不明显(尽管我认为这可以很容易地被优化器,如果 VLA 语义与常规数组没有不同,则可以优化 VLA 并尝试创建常规数组 => ,这会因我所说的相同原因而失败)。

长话短说:分配所有内存(您甚至无法寻址)是没有意义的,尤其是在堆栈上。使用堆并只分配您需要的内容。如果您有特殊要求,您应该研究操作系统提供的特殊虚拟内存功能。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 size_t 声明最大数组 的相关文章

  • 到底什么是“位填充”或“填充位”?

    我只是在互联网上找不到任何关于 位填充 真正含义的详细解释 并且在 Stack Overflow 上也没有找到与位填充相关的线程的任何答案 我还搜索了 ISO 9899 1990 其中提到了 位填充 但没有根据我的需要进行解释 我在网上找到
  • 除了第一列之外,Gridview 行可点击?

    我使用以下代码使 gridview 的整行可单击 protected void gridMSDS RowDataBound object sender GridViewRowEventArgs e if e Row RowType Data
  • 如何在 mongo shell 查询中仅投影嵌套数组的匹配字段

    我对 mongodb 相当陌生 我希望这是一个简单的问题 我有一个嵌套架构 其中有一个数组字段 其中该数组的每个项目都是一个本身具有数组字段的对象 例如 gt db mytest insert name a top x 1 y 2 nest
  • 如何使用 saxon 将文档类型参数传递给 xslt?

    对于发送原子数据类型将使用类似 transformer SetParameter new QName customXml new XdmAtomicValue true 如何将 XML Node 作为参数从 C 传递给 XSLT 你能帮我么
  • Rx Framework:在超时时执行操作,而不中断原始可观察序列

    给定一个可观察的源 通过轮询低级设备的 变化 状态生成 observable source metacode IObservable
  • 限制纬度和经度值的模数

    我有代表纬度和经度的双精度数 我可以轻松地将经度限制为 180 0 180 0 具有以下功能 double limitLon double lon return fmod lon 180 0 360 0 180 0 这是有效的 因为一端是排
  • 将 Visual Studio 2012 C++ 单元测试项目链接到 exe 会导致访问冲突

    我从现有的整体 exe 本机 Visual Studio 2012 项目开始 我想添加一个本机单元测试项目 根据http msdn microsoft com en us library hh419385 aspx objectRef ht
  • 实体框架 5 不清除导航属性

    我在 Entity Framework 5 中遇到了这个奇怪的问题 我在其中一个实体中有一个导航属性 我想将其设置为null 但由于某种原因 该属性只有在我第二次调用该属性时才会被清除 using var db new Entities v
  • 混合 VS2012 平台工具集

    我们正在从 VS2005 切换到 VS2012 update 2 我们正在构建大量 主要是控制台 本机 C 无 MFC ATL 可执行文件 它们使用几个常见的静态链接库 这些可执行文件主要在 Win7 计算机上运行 但有些也部署在较旧的 X
  • DLL 需要访问其应用程序的符号

    在 C 中 DLL 是否可以访问加载它的应用程序的某些符号 我有一个加载插件 dll 的应用程序 这些插件需要访问该应用程序的某些API 是否可以在不创建共享此 API 的新 DLL 的情况下实现此目的 函数指针结构适合这种情况吗 示例 主
  • 输入缓冲区刷新

    考虑下面的代码 include
  • 为什么数组不符合 Equatable,而它的项在 Swift 中是 Equatable?

    UPDATE 从 Xcode 9 3 开始 包括斯威夫特 4 1 数组相等按预期工作 并且原始问题中的代码编译没有错误 然而 请查看已接受的答案 因为它提供了更好 更现代的解决方案 原问题如下 当我尝试声明类型为泛型枚举的实例时 Post
  • C#中如何将委托转换为对象?

    我正在使用反射类来调用其他 dll 上的一些方法 方法的参数之一是委托类型 我想通过使用反射来调用这个方法 所以我需要将函数参数作为对象数组传递 但我找不到任何关于 如何将委托转换为对象 提前致谢 委托是一个对象 只需像平常一样创建预期的委
  • 通过 Nuke.Common/NuGet.CommandLine 部署 NuGet 包时如何通过 Azure Auth

    我正在尝试通过 Azure DevOps 上的 Nuke 和 CI CD 自动执行 NuGet 包更新 一切都构建得很好 但在 PushNuGet 步骤中 该过程尝试通过弹出窗口向 Azure 进行身份验证 这显然从未在 in devops
  • 如何定义 Swagger UI 参数的默认值?

    我已将 Swagger Swashbuckle 集成到 NET Core 2 2 API 项目中 一切都很好 我的要求纯粹是为了方便 考虑以下 API 方法 public Model SomeEstimate SomeRequest req
  • 为 C++ 类播种 rand()

    我正在开发一个 C 类 它使用rand 在构造函数中 我真的希望这个班级在几乎所有方面都能照顾好自己 但我不知道在哪里播种rand 如果我播种rand 在构造函数中 每次构造我的对象类型的新实例时都会对其进行播种 因此 如果我按顺序创建 3
  • 访问 Visual Studio 扩展中的当前代码窗格

    我正在编写一个 Visual Studio 2010 扩展 在代码视图中带有右键单击菜单 我希望能够从菜单项事件处理程序检查当前代码 但无法在对象模型中找到执行此操作的位置 如何在 Visual Studio 扩展中访问当前窗口中的代码 E
  • 构建 OpenCV 时出错 :: MonitorFromRect 未在此范围内声明

    我试图建立OpenCV version 2 4 8与它一起使用CodeBlocks and MinGw 我按照以下指示进行操作here http kevinhughes ca tutorials opencv install on wind
  • AddressAccessDeniedException :无需 netsh 即可解决它?

    我遇到了异常AddressAccessDeniedException因为我的processus没有注册URL的权限 我首先以管理员身份运行我的程序 好的 它成功了 但我现在想要分发我的应用程序 并且我希望每个用户都能够运行它 而不必成为管理
  • GetActiveObject() 与 GetObject() -- MK_E_UNAVAILABLE 错误

    All 我在将一些 VBA 代码转换为 C 时遇到一些问题 我们有一个充当本地 COM 服务器的第 3 方应用程序 在我们使用的VBA代码中获取对象 获取对现有对象的引用 e g Set appHandle GetObject ProgId

随机推荐