我对C ++很陌生,所以我对静态数组的工作方式感到有些困惑。我知道在C#中阵列没有被放入内存,直到它首次被访问,如果你想让它立即可访问,这可能会有问题。但是,我正在努力将Perlin类转换为C ++,并且我希望有多个静态数组,其中只有一个可以在运行时或其中任意数量使用。实际上,它并不是那么大的内存问题,因为它们都不会超过50kb,但是,我宁愿知道是否有可能确保阵列不会出现问题。除非我要求,否则会加载到内存中。有没有办法确保源代码中定义的静态数组没有加载到内存中,除非要求?这是一个非常挑剔的事情(尤其是x64),但我希望尽可能优化它。我讨厌用一些不会被使用的东西来记忆。
或许静态数组甚至还没有 - 只是动态类对象包装数组?
我想真正的问题是:在c ++中实现表查找的最有效解决方案是什么?可能并非全部使用?
答案 0 :(得分:5)
静态数组将存在于您的内存空间中,无法省略或释放它们,但这与内存中的内容不同['将其留给Windows虚拟内存管理器。当您第一次访问阵列时,Windows会将其从磁盘带入RAM。
答案 1 :(得分:2)
不,你不能这样做:C ++中静态初始化的结构和数组与你的其余代码一起被加载到内存中,所以你不能影响它加载的时间。
如果必须在运行时加载静态数组,请考虑更改策略以将数据放入单独的文件中,并添加初始化函数以将文件读入静态vector
对象。此策略导致将数据放入动态内存区域,而vector
对象本身可以保留static
。
答案 2 :(得分:2)
Windows和Linux都使用"要求加载",这意味着当到达它的代码实际需要数据时,会加载代码和数据。因此,假设数据是常量和全局的(例如static const int x[number] = { ... }
),则不会加载数据。 [典型的粒度是4KB或其中的一些倍数,但如果你有几百个50KB的数据块没有被使用,你不应该在内存中看到它们,因此加载时没有延迟程序本身]。
与性能和优化一样,最好不要通过尝试预测某个区域的问题(也就是"过早优化")来使事情过于复杂化,并确保你做到了在优化之前,我认为可能是一个问题实际上是一个问题。