我正在做一种叫做"叠画"的技巧.确定特定函数使用多少堆栈空间.
如果我在堆栈上分配了 1MB的物品.然后我确定我没有使用任何这些项目.Windows会自动解除(免费)那些未使用的页面吗?
我特别想知道Windows的VMM.关于页面是否已经提交或者不一定是已经提交但只是保留?
换句话说,如果我手动访问内存到1MB可能会导致Windows违反访问冲突?
你不删除在堆栈上分配的东西; 它会自动回收,因为当您从当前作用域退出时,堆栈指针将移回到前一个堆栈帧1,因此有效回收当前作用域中对象所用的所有内存.
根据原则,当应用程序加载到内存中时,所有堆栈都被分配,因此它是一个固定大小的结构,可以反复重复使用(当代码流进出范围时); 操作系统可能会发挥巧妙的技巧(通过使用保护页面提交堆栈的上半部分,这只是在应用程序启动时保留),但一般来说这不应该与您有关.
堆栈大小是PE头(可执行文件的头)的一部分,您可以使用链接器选项进行设置.您可以通过窥探在内存中加载的PE结构来检索已加载的可执行文件的此类值(基本上它HMODULE
是可执行文件在内存中映射的位置); 我认为ImageHelper库在此任务中非常有用.
编辑
换句话说,如果我手动访问内存到1MB可能会导致Windows违反访问冲突?
如果它已经被提交(即你在堆栈上分配和释放了1 MB的对象),我认为它不会发生.
Windows不会知道堆栈的那部分不再使用.Windows可以检测是否必须提交更多页面,使用保护页面来检测对堆栈上半部分的访问,但是它无法知道这些页面不再被使用.
实际上它可以在上下文切换时查找堆栈指针,但是它会破坏使用堆栈执行"聪明"操作的应用程序,并且通常这将是一个不值得努力的优化:如果没有内存那些页面可以还是被打开了.
尽管如此,为了安全起见(例如,如果您不知道是否已经进行了分配),您应该从当前使用的部分向上阅读堆栈,因此如果页面向上还没有提交,您仍然会触及保护页面,提醒Windows为堆栈提交更多页面.
归档时间: |
|
查看次数: |
336 次 |
最近记录: |