Глобалните променливи и тези със статичен живот обикновено се съхраняват в сегмент от данни, който се настройва от програмата за зареждане на изпълними файлове на операционната система.
Този товарач вероятно прави това, което @John Zwinck каза за Unix. В Windows има VirtualAlloc например, който може да се използва и за разпределяне на памет в адресното пространство на друга програма.
Локалните променливи обикновено се съхраняват в така наречения стек. Разпределенията в стека са доста бързи, тъй като обикновено се състоят само от модификация на регистъра на указателя на стека (sp, esp, rsp при семейството процесори x86). Така че, когато имате int (размер: 4 байта), този регистър просто ще бъде намален с 4, докато стекът расте надолу. В края на обхвата старото състояние на регистъра на стека се възстановява.
Също така това прави препълването на стека опасно, когато можете да презапишете други променливи в стека, които не трябва да се променят, като адреси за връщане на извиквания на функции.
Динамичните променливи са променливи, разпределени с помощта на malloc (C) или new (C++) или някоя от специфичните за операционната система функции за разпределение. Те се поставят върху така наречената купчина. Те живеят, докато не бъдат изчистени с помощта на free/delete/os-specific-deallocator или програмата излезе (в този случай нормална операционна система се грижи за почистването).
Освен това динамичното разпределение е най-бавното от трите, тъй като изисква извикване на операционната система.
person
Felix Bytow
schedule
02.03.2015