如何使静态数组在第一次使用之前不占用内存
How to keep a static array out of memory until first used
我是c++的新手,所以我对静态数组的工作方式有点困惑。我知道在c#中,数组在第一次访问之前不会被放入内存中,如果你想要立即访问它,这可能会有问题。然而,我正在努力将一个柏林类转换为c++,我希望有多个静态数组,其中只有一个可以在运行时使用或任意数量的数组。实际上,这并不是一个很大的内存问题,因为它们都不会超过50kb,但是,我宁愿知道是否有可能确保数组不加载到内存中,除非我要求它。是否有一种方法来确保在源代码中定义的静态数组不加载到内存中,除非要求?这是一个相当挑剔的事情(特别是在x64中),但我更喜欢尽可能优化它。我讨厌用一些不会用到的东西占用内存。
或者也许静态数组甚至不是要走的路-只是动态类对象包装数组?
我想真正的问题是:在c++中实现表查找的最有效的解决方案是什么?
静态数组将在您的内存空间中,没有办法省略或释放它们,但这与'在内存中'不同。把它留给Windows虚拟内存管理器。当您第一次访问数组时,Windows将把它从磁盘放入RAM。
不,你不能这样做:c++中静态初始化的结构和数组与其他代码一起加载到内存中,所以你不能影响它加载的时间。
如果您必须在运行时加载静态数组,请考虑更改策略,将数据放入单独的文件中,并添加初始化函数以将文件读取到静态vector
对象中。这种策略的结果是将数据放入动态内存区域,而vector
对象本身可以保留static
。
Windows和Linux都使用"按需加载",这意味着当代码到达它实际需要数据时,代码和数据被加载。因此,假设数据是常量和全局的(例如static const int x[number] = { ... }
),则不会加载数据。[典型的粒度为4KB或其倍数,但如果您有几百个50KB的数据块没有被使用,则不应该在内存中看到它们,因此加载程序本身不会延迟]。
当涉及到性能和优化时,最好不要通过试图预测某个领域的问题(即"过早优化")来使事情过于复杂,并确保在优化它之前您认为可能是问题的内容实际上是问题。
- 我们可以删除链表中静态内存中的节点吗
- 添加静态constexpr成员是否会更改结构/类的内存映射
- 以下代码执行哪种内存分配(动态或静态)?
- 将静态内存更改为动态C++
- 内联asm编译器屏障(内存阻塞器)是算作外部函数,还是算作静态函数调用
- 完全释放静态对象内存
- 我应该在这个程序中使用静态内存分配还是动态内存分配
- 类中的静态变量和内存分配及其使用
- 为什么将鼠标悬停在静态 Win32 控件上会增加内存并删除我的 GUI?
- 有什么需要,局部静态变量在编译时分配内存?
- 非静态数据成员初始值设定项仅适用于 和动态内存
- 使用 MapViewOfFile 分配静态共享内存
- 是静态分配的数组的内存分配始终是地址值的顺序
- 测量静态,堆和堆栈内存?(C ,Linux -CentOS 7)
- 将动态内存分配转换为静态
- 删除静态/动态指针后无法重新分配内存
- C++ 中对象数组的静态内存分配
- 无法使用 GetProcessMemoryInformation 测量静态数组内存使用情况
- 静态局部变量没有物理内存
- 在声明节点创建链接列表时,为什么静态内存分配不起作用