min*_*ang 17
BYTE* data = new BYTE[size];
Run Code Online (Sandbox Code Playgroud)
在此代码中,无论给出什么大小,返回的内存区域都是连续的.如果堆管理器无法分配连续的内存size,则失败.malloc将返回异常(或NULL ).
程序员总会在进程的地址空间中看到连续(和是,无限:-)内存的错觉.这就是虚拟内存为程序员提供的功能.
请注意,程序员(除少数嵌入式系统之外)总是看到虚拟内存.但是,可以以任意方式在物理存储器中映射实际连续的存储器(以"页面"大小的粒度,通常为4KB).那个映射,你看不到,而且大多数你不需要理解它(除了非常具体的页面级优化).
那这个呢?
BYTE* data1 = new BYTE[size1];
BYTE* data2 = new BYTE[size2];
Run Code Online (Sandbox Code Playgroud)
当然,你不能说的相对地址data1和data2.这通常是不确定的.它取决于请求发生时的堆管理器(例如malloc,通常new只是包装malloc)策略和当前堆状态.
在进程的地址空间中分配的内存将是连续的.
这些字节如何映射到物理内存是特定于实现的; 如果你分配了一个非常大的内存块,它很可能被映射到物理内存的不同部分.
编辑: 由于有人不同意保证字节是连续的,标准说(3.7.3.1):
分配功能尝试分配所请求的存储量.如果成功,它将返回存储块的起始地址,其长度以字节为单位应至少与请求的大小一样大.
| 归档时间: |
|
| 查看次数: |
3699 次 |
| 最近记录: |