一般定位new是在指定内存是32K。。。 或更大的空间里工作
如果我现在想设计一个软件,使得整个软件一运行,就占有2G的内存,然后以后软件的堆空间,优先在这个2G空间中使用,如果不够用,在继续一点一点的增加空间
那我这个思路,可以用placement new吗?
或者我需要用c++和汇编?
或我需要用c与sdk??
求高手指点一些思路
11 个解决方案
#1
你这不就是内存池的思想么
#2
#3
要精确定位分配的地址空间是很困难的,但只是LZ的需求,如LS所说,普通的内存池就行。
至于placement new,只不过是一种形式上的用法而已,一个使用new表达式已经分配的内存中构造对象的手段。事实上标准库默认实现就可以什么空间都不分配,只是返回指针。
至于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。
因为用户程序的内存区域只有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下,我就只有内存池一种用法吗?
那如果是linux/unix下,我就只有内存池一种用法吗?
#11
Linux没有现成的堆函数,都是malloc什么的都是自己去直接分配内存页,用伙伴算法什么的管理,其实你自己写内存池,管理效率不一定比malloc要高。
#1
你这不就是内存池的思想么
#2
#3
要精确定位分配的地址空间是很困难的,但只是LZ的需求,如LS所说,普通的内存池就行。
至于placement new,只不过是一种形式上的用法而已,一个使用new表达式已经分配的内存中构造对象的手段。事实上标准库默认实现就可以什么空间都不分配,只是返回指针。
至于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。
因为用户程序的内存区域只有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下,我就只有内存池一种用法吗?
那如果是linux/unix下,我就只有内存池一种用法吗?
#11
Linux没有现成的堆函数,都是malloc什么的都是自己去直接分配内存页,用伙伴算法什么的管理,其实你自己写内存池,管理效率不一定比malloc要高。