1.为什么堆栈内存的大小是固定的?

时间:2016-08-02 17:45:52

标签: memory-management stack heap stack-overflow heap-memory

  1. 如果只有堆栈内存,没有堆内存,那么会产生哪些问题?我认为它会使程序变得非常快。
  2. 我知道对象是在堆内存中创建的。 但如果在堆栈内存中创建对象,那么问题是什么?为什么我们创建堆内存?
  3. 我读了。

    堆栈

    #This function will be matching error lines from error repo files and if matched it will yank those lines from the files.
    def MatchandYankerrors():
        ferrorrepo = errorrepopath
        conclufile = os.path.join(Decompressfilepath,(appservername+'conclusion'))
        ferrorfile = open(ferrorrepo)
        output = []
    
        for errlines in ferrorfile: #Pick each line from error_dict
            c = 0
            newerrliens = errlines.strip()  # error_dict file each line strip and spilit
            #confile = open(conclufile,"r+")#This will keep opening file every time when we need new error to search.
            #confilelines = confile.readlines() #This will read all lines from file.
            #confile.seek(0)
            i=0
            for line in fileinput.input(conclufile,inplace=1,backup='.orig'):
                line = line.strip()
                if newerrliens in line:
                    pass
                else:
                    print line
            fileinput.close()
    

    very fast access
    don't have to explicitly de-allocate variables
    space is managed efficiently by CPU, memory will not become fragmented
    limit on stack size (OS-dependent)
    

1 个答案:

答案 0 :(得分:2)

我将从堆栈的堆/缺点的优点开始:

<强> 1。分配顺序独立释放:这是您问题的最重要答案。如果只有基于堆栈的内存,则无法立即释放e内存区域,除非它立即位于堆栈顶部。但是,对于堆,无论分配请求的顺序如何,都可以释放内存。与在动态软件中一样,您无法在软件的整个生命周期中了解免费请求的顺序,这就是您不总是希望使用堆栈内存的原因。

<强> 2。确定系统范围的堆栈大小:另一个相关点是,如果只使用堆栈内存,则意味着系统中的所有线程都将具有固定内存。在这种情况下,确定理想的默认线程堆栈大小并不容易。这会导致内存过度消耗。因此,即使实际上没有足够的内存,这也可能导致内存不足。关于这一个,我建议看看这个:http://linuxtips.manki.in/2011/11/tweaking-stack-size-of-linux-processes.html

堆栈式堆分配器可能有用的区域:游戏引擎采用这种技术。一个很好的例子是加载和卸载资源(纹理,着色器,三维网格等) 在加载水平并卸载它。像分配器这样的堆栈是一种自然的解决方案,因为卸载资产的顺序与加载它们相反。在这里,您可以看到实施:https://github.com/davidaug/stackallocator

堆积的其他问题:您还可以将这些问题视为堆栈的更多优点,作为您在问题中提到的专业人员的补充:

a)多核系统:关于堆栈分配器的另一个优点是,由于来自不同CPU核心的分配请求是堆分配器设计需要解决的重要问题,因此锁争用会少得多。作为锁争用的补充,您还必须处理错误共享等问题。关于这一个,您可以查看http://www.drdobbs.com/parallel/understanding-and-avoiding-memory-issues/212400410

b)碎片:我提到的第一个项目(分配订单独立释放)是必须要求。但是,这也带来了碎片问题:What is memory fragmentation?