new[] 是否保留不可见存储? C++ 动态内存分配
does new[] resereve invisible storage? c++ dynamic memory allocation
所以我注意到了一些奇怪的事情。我为我的程序预留了 4 GB 的物理内存。我已经分配了 2 GiB 的存储空间,并尝试使用下面的代码添加 1 GiB。然后程序抛出一个错误的分配,说内存已满。所以我想知道我是否分配 1 GiB 使用。
char* p1 = new char[1073741824];
这是否会保留一些使用任务管理器或资源监视器未显示的额外存储空间?
使用 visual studio 2017 Windows 10.
有 一些 与分配相关的开销,但这相当小 - 正如@zzxyz 所说,您的问题可能是内存碎片。总共可能有 ~2GB 内存可用,但可能没有 1GB 的 连续 内存可用(这是您明确要求的)。
您为其分配存储空间的任何对象都需要为其成员提供连续存储空间。 new[]
为对象的 连续数组 请求内存,因此整个存储块需要是连续的 - 这是 C++ 为您提供的保证,这可能非常有用。如果你用 new 单独分配每个单独的对象,那么只有每个对象的存储需要是连续的,然后所有对象都可以分散在每个它们自己的小连续块中的整个内存中。注意 new[]
与 new
.
所以我注意到了一些奇怪的事情。我为我的程序预留了 4 GB 的物理内存。我已经分配了 2 GiB 的存储空间,并尝试使用下面的代码添加 1 GiB。然后程序抛出一个错误的分配,说内存已满。所以我想知道我是否分配 1 GiB 使用。
char* p1 = new char[1073741824];
这是否会保留一些使用任务管理器或资源监视器未显示的额外存储空间?
使用 visual studio 2017 Windows 10.
有 一些 与分配相关的开销,但这相当小 - 正如@zzxyz 所说,您的问题可能是内存碎片。总共可能有 ~2GB 内存可用,但可能没有 1GB 的 连续 内存可用(这是您明确要求的)。
您为其分配存储空间的任何对象都需要为其成员提供连续存储空间。 new[]
为对象的 连续数组 请求内存,因此整个存储块需要是连续的 - 这是 C++ 为您提供的保证,这可能非常有用。如果你用 new 单独分配每个单独的对象,那么只有每个对象的存储需要是连续的,然后所有对象都可以分散在每个它们自己的小连续块中的整个内存中。注意 new[]
与 new
.