std::initializer_list 堆是否分配内存?
Does std::initializer_list heap allocate memory?
简单的问题,std::initializer_list堆会分配内存吗?我不是在谈论它的元素项,只是存储元素的缓冲区本身。
以下是 cppPreferred 要说的(强调我的(:
在原始初始值设定项列表对象的生存期结束后,不保证基础数组存在。std::initializer_list 的存储未指定(即它可以是自动、临时或静态只读内存,具体取决于情况(。 (至C++14(
基础数组是 const T[N] 类型的临时数组,其中每个元素都是从原始初始值设定项列表的相应元素复制初始化的(缩小转换无效除外(。基础数组的生存期与任何其他临时对象相同,只是从数组初始化initializer_list对象会延长数组的生存期,就像将引用绑定到临时对象一样(具有相同的例外,例如初始化非静态类成员(。底层数组可以在只读内存中分配。 (自C++14起(
总而言之,可能不是。我想不出编译器或库作者会选择将其放在堆上的情况,但是"未指定"一词的使用听起来像无法保证如何分配临时数组。C++标准中可能有更好的规范。
另一个要点是,您绝对不应该尝试写入底层阵列内存。
这是一个有趣的问题。我同意乔希的回答,只是想补充一点,我创建了以下相关实验。我尝试编译并运行以下代码:
#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 << "0n";
}
使用 GCC 创建的最终可执行文件有 328 MB,这表明std::intializer_list
的整个实例实际上呈现在程序的数据段中。运行时,没有分段错误,Valgrind 报告除了向量v
所需的 400 MB 之外没有堆分配。
相关文章:
- 在c++中为我自己的基于指针的数组分配内存的正确方法
- 给定一个指向堆分配内存的指针,智能指针实现如何为其找到合适的释放函数?
- 如果 const 不分配内存,为什么我可以获取 const 的地址?
- 在函数中分配内存时出现问题
- 如何为 std::vector 分配内存,然后稍后为某些元素调用构造函数?
- constexpr new 如何分配内存?
- 在构造函数中分配内存失败是如何冒泡的
- LLVM 传递以在特定地址分配内存
- CudaMalloc 在分配内存时失败
- 为什么它在不分配内存的情况下工作正常
- 为什么在正确解除分配内存时出现内存泄漏?
- 如何通过 malloc 为队列数组分配内存?
- vector是否为std::移动的对象连续分配内存
- 删除类成员的动态分配内存的最佳方法是什么
- 唯一指针是否在堆或堆栈上分配内存?
- 如果不分配内存,我如何能够为变量创建和分配值?
- std::initializer_list 堆是否分配内存?
- 如何按顺序或在指定的地址分配内存?
- 是否可以使用 malloc 为类对象分配内存?
- 迭代器是否分配内存(如指针)?