当前位置: 首页 > 知识库问答 >
问题:

stdd::initializer_list堆分配内存吗?

凌炜
2023-03-14

简单的问题是,std::initializer\u list堆是否分配内存?我说的不是它的元素项,而是缓冲区本身来存储元素。

共有2个答案

王宏深
2023-03-14

这是一个有趣的问题。我同意Josh的回答,只是想补充一下,我创建了以下相关实验。我尝试编译并运行以下代码:

#include <iostream>
#include <vector>

int main()
{
   std::vector<int> v = {

#include "x.inc"

   };

   std::cout << v.size() << std::endl;
}

其中x.inc包含100M次0,加上尾随的0,由该程序生成:

#include <fstream>

int main()
{
   std::ofstream f("x.inc");

   for (int i = 0; i < 100000000; i++)
      f << "0, ";
   f << "0\n";
}

用GCC创建的结果可执行文件有328 MB,这表明整个std::intializer\u list实例实际上显示在程序的数据段中。运行时,没有分段错误,Valgrind报告没有堆分配,除了向量v所需的400 MB之外。

申博厚
2023-03-14

以下是cp首选项必须说的(强调我的):

底层数组不能保证在原始初始化程序列表对象的生命周期结束后仍然存在。std::initializer_list的存储是未指定的(即它可以是自动、临时或静态只读内存,具体取决于情况)。(直到C14)

底层数组是一个const T[N]类型的临时数组,其中每个元素都是从原始初始值设定项列表的相应元素复制初始化的(缩小转换无效除外)。基础数组的生存期与任何其他临时对象相同,只是从数组初始化initializer\u list对象会延长数组的生存期,就像将引用绑定到临时对象一样(但也有相同的例外,例如初始化非静态类成员)。底层阵列可以在只读内存中分配。(自C 14起)

也就是说,可能不是。我想不出编译器或库作者会选择将其放在堆上的情况,但“未指定”一词的使用让它听起来似乎无法保证如何分配临时数组。C标准中可能有更好的规范。

另一个要点是您绝对不应该尝试编写底层数组内存

 类似资料:
  • 问题内容: 是局部变量,将其存储在堆或堆栈中的何处? 问题答案: 在堆上。每当您用来创建对象时,它都会在堆上分配。

  • 我试图了解分配给堆栈和堆的内存量。假设sizeof(char)=1字节,sizeof(void*)=4字节。给定以下代码: 我们被告知分配给堆的内存量是5个字节,我明白这确实是malloc(strlen(str2)=5)中的量。但是,我不明白的是分配给堆栈的内存量是如何达到18个字节的?我想如果他们给我们一个指针大小是4个字节的信息,那么我们有4个字节的指针str1和另外6个字节的数组str2(包

  • 在这个练习中,你会在难度上做一个大的跳跃,并且创建出用于管理数据库的完整的小型系统。这个数据库并不实用也存储不了太多东西,然而它展示了大多数到目前为止你学到的东西。它也以更加正规的方法介绍了内存分配,以及带领你熟悉文件处理。我们使用了一些文件IO函数,但是我并不想过多解释它们,你可以先试着自己理解。 像通常一样,输入下面整个程序,并且使之正常工作,之后我们会进行讨论: #include <stdi

  • 问题内容: 我正在研究真正了解JVM中内存分配的工作方式。我正在编写一个内存不足的应用程序:堆空间异常。 我知道我可以传入VM参数(例如Xms和Xmx)来增加JVM为正在运行的进程分配的堆空间。这是解决此问题的一种可能的解决方案,或者我可以检查代码是否存在内存泄漏并在那里解决问题。 我的问题是: 1)JVM如何实际为其分配内存?这与OS如何将可用内存传递给JVM有什么关系?或更一般而言,任何进程的

  • 我想真正了解内存分配在JVM中是如何工作的。我正在编写一个内存不足的应用程序:堆空间异常。 我知道我可以传入VM参数,如Xms和Xmx,以增加JVM为正在运行的进程分配的堆空间。这是一个可能的解决方案,或者我可以检查我的代码内存泄漏并修复那里的问题。 我的问题是: 1)JVM实际上如何为自己分配内存?这与OS如何将可用内存传递给JVM有什么关系?或者更一般地说,为任何进程分配内存实际上是如何工作的

  • 问题内容: 我只是在一本Java书中读到这句话,说Java中的对象驻留在堆上。使用堆是因为它是快速存储数据和快速检索数据的最佳方法吗? 我只有一个关于数据结构初学者的想法。我的意思是为什么不堆叠或其他? 问题答案: 堆栈的问题是您只能删除最近添加的内容。这对于局部变量非常有效,因为它们在您进入和退出函数时会来来去去,但对于生命周期不遵循单个函数的任意数据而言,效果则不太好。内存堆使您可以随意添加和