7
|
Samuel Danielson · 技术社区 · 16 年前 |
![]() |
1
16
其实有两个原因:
总而言之,您最终将实现许多内存管理功能(实际上几乎是重新实现malloc),而没有可移植性的好处。 因此,理由如下:
|
![]() |
2
12
|
![]() |
3
11
使用malloc,您可以扩展和缩小阵列:它变得动态,因此您可以精确地分配所需的资源。 |
![]() |
4
7
我想这就是所谓的自定义内存管理。 你可以这样做,但你必须自己管理那块内存。 |
![]() |
5
3
一个上限取决于4GB(32位)虚拟地址空间在用户空间和内核空间之间的划分方式。对于Linux,我认为最常见的分区方案对于用户空间有3 GB的地址范围,对于内核空间有1 GB的地址范围。分区在内核构建时是可配置的,2GB/2GB和1GB/3GB分割也在使用中。加载可执行文件时,必须为每个对象分配虚拟地址空间,而不管是否分配了实际内存对其进行备份。 |
![]() |
6
3
如前所述,您还可以调整内存大小,以完全使用所需的内容。在性能关键的上下文中,如果可以避免的话,不分页到虚拟内存是很重要的。 |
![]() |
7
3
除了超出范围之外,没有其他方法可以释放堆栈分配。所以,当您实际使用全局分配时,VM必须分配给您真正的硬内存,它将被分配并一直保留,直到您的程序用完为止。这意味着任何进程只会在其虚拟内存使用中增长(函数具有本地堆栈分配,这些将被“释放”)。 一旦堆栈内存超出函数范围,就不能“保留”它,它总是被释放的。所以,您必须知道在编译时将使用多少内存。 这就归结为您可以拥有多少int foo[1<<29]。因为第一个会占用整个内存(32位)并且会(让我们假设:0x000000),所以第二个会解析为0xffffffff或其他。那么第三个会决定什么?32位指针无法表示的内容。(请记住,堆栈保留在编译时部分解析,在运行时部分解析,通过偏移量,当您分配此变量或该变量时,堆栈偏移量被推多远)。 所以答案是,一旦你有了int-foo[1<<29],你就不能再有任何合理深度的函数和其他局部堆栈变量了。 |
![]() |
8
2
除非你知道自己在做什么,否则你真的应该避免这样做。尽量只请求所需的内存。即使它没有被使用,或者妨碍了其他程序,它自己也会把这个过程搞砸。这有两个原因。首先,在某些系统上,特别是32位系统上,在极少数情况下,它会导致地址空间过早耗尽。此外,许多内核对保留/虚拟/未使用内存有某种进程限制。如果您的程序在运行时请求内存,如果内核请求保留超过此限制的内存,那么它可以终止进程。我见过由于malloc失败而崩溃或退出的程序,因为它们保留了GBs的内存,而只使用了很少的MB。 |
![]() |
J. Doe · 线程静态变量与实例化 7 年前 |
![]() |
D.B · django静态文件不随虚拟环境出现 7 年前 |
![]() |
157 239n · 我可以在UI线程之外使用getFilesDir吗 7 年前 |
![]() |
John David · ——等待这个。方法();在静态方法中不起作用 7 年前 |
![]() |
Yu.Pan · Spring boot项目找不到静态文件 7 年前 |
![]() |
Yu.Pan · 无法在springboot静态内容中获取文件 7 年前 |
![]() |
BaCh · C++:使用名称相同但参数不同的类成员和静态函数失败 7 年前 |