c++如何在指定的内存中new一个空间呢?

时间:2022-08-30 18:09:12
我知道,大家会想当然的回答,定位new, placement new

一般定位new是在指定内存是32K。。。 或更大的空间里工作

如果我现在想设计一个软件,使得整个软件一运行,就占有2G的内存,然后以后软件的堆空间,优先在这个2G空间中使用,如果不够用,在继续一点一点的增加空间

那我这个思路,可以用placement new吗?
或者我需要用c++和汇编?
或我需要用c与sdk??

求高手指点一些思路

11 个解决方案

#1


你这不就是内存池的思想么

#2


该回复于2011-04-25 13:05:03被版主删除

#3


要精确定位分配的地址空间是很困难的,但只是LZ的需求,如LS所说,普通的内存池就行。
至于placement new,只不过是一种形式上的用法而已,一个使用new表达式已经分配的内存中构造对象的手段。事实上标准库默认实现就可以什么空间都不分配,只是返回指针。

#4


这就是个内存池啊,你按char预先分配出来一定数量的内存,因为一个char占一个字节,为内存分配的最小单位,然后你要用的内存就从这个池里取,不够的话可以再增加池的容量。

#5


内存池呀。。有现成的用。

#6


这个就是你要实现操作系统的东西了,操作系统有的是内存,你实现一个就可以了

#7


2GB以上不太现实,除非你是64位系统或者设置了3GB用户空间。
因为用户程序的内存区域只有2GB,刨除程序代码、DLL、保留空间等,能用的超过1.5GB。
new就是从堆里分配空间的,如果你的软件要用很大的数据块,建议用VirtualAlloc从系统分配虚拟内存页来自己管理,不过一般最多只能分配1.2GB。Windows提供的堆也可以用API比如HeapAlloc访问,但是它适合10MB一下的零碎数据。
VirtualAlloc可以直接在VC里用,不用汇编也不需要SDK。

#8


一般来说先用VirtualAlloc申请(MEM_RESERVE)大块内存,比如1.2GB,然后需要时在提交(MEM_COMMIT
)一遍它才会真的跟你分配内存。这样可以不用一次全分配掉,速度快一些。

#9


内存池就是malloc一大段内存,之后截成一段一段的内存,放到相应的桶里给你使用.

分配出去之后必须由用户自己归还,内存池在程序整个生命周期只开辟内存,不释放内存.

如果内存使用状态峰值与谷值差距过大,不建议使用内存池.

#10


大家好
那如果是linux/unix下,我就只有内存池一种用法吗?

#11


Linux没有现成的堆函数,都是malloc什么的都是自己去直接分配内存页,用伙伴算法什么的管理,其实你自己写内存池,管理效率不一定比malloc要高。

#1


你这不就是内存池的思想么

#2


该回复于2011-04-25 13:05:03被版主删除

#3


要精确定位分配的地址空间是很困难的,但只是LZ的需求,如LS所说,普通的内存池就行。
至于placement new,只不过是一种形式上的用法而已,一个使用new表达式已经分配的内存中构造对象的手段。事实上标准库默认实现就可以什么空间都不分配,只是返回指针。

#4


这就是个内存池啊,你按char预先分配出来一定数量的内存,因为一个char占一个字节,为内存分配的最小单位,然后你要用的内存就从这个池里取,不够的话可以再增加池的容量。

#5


内存池呀。。有现成的用。

#6


这个就是你要实现操作系统的东西了,操作系统有的是内存,你实现一个就可以了

#7


2GB以上不太现实,除非你是64位系统或者设置了3GB用户空间。
因为用户程序的内存区域只有2GB,刨除程序代码、DLL、保留空间等,能用的超过1.5GB。
new就是从堆里分配空间的,如果你的软件要用很大的数据块,建议用VirtualAlloc从系统分配虚拟内存页来自己管理,不过一般最多只能分配1.2GB。Windows提供的堆也可以用API比如HeapAlloc访问,但是它适合10MB一下的零碎数据。
VirtualAlloc可以直接在VC里用,不用汇编也不需要SDK。

#8


一般来说先用VirtualAlloc申请(MEM_RESERVE)大块内存,比如1.2GB,然后需要时在提交(MEM_COMMIT
)一遍它才会真的跟你分配内存。这样可以不用一次全分配掉,速度快一些。

#9


内存池就是malloc一大段内存,之后截成一段一段的内存,放到相应的桶里给你使用.

分配出去之后必须由用户自己归还,内存池在程序整个生命周期只开辟内存,不释放内存.

如果内存使用状态峰值与谷值差距过大,不建议使用内存池.

#10


大家好
那如果是linux/unix下,我就只有内存池一种用法吗?

#11


Linux没有现成的堆函数,都是malloc什么的都是自己去直接分配内存页,用伙伴算法什么的管理,其实你自己写内存池,管理效率不一定比malloc要高。