﻿# Сколько памяти будет доступно приложению в Win32 и в Win64

При разработке программного продукта для операционной системы семейства Windows необходимо помнить об ограничениях, накладываемых на размер данных, которые программа может объявлять и использовать\.

Windows накладывает на программы следующие 3 вида ограничений:

* Статические данные\. Ограничение накладывается на размер самого исходного кода программы и размер статически выделяемой памяти\. В языке C\+\+ такие данные обычно представлены переменными, объявленными на глобальном уровне вне процедур\. Как для 32\-битных, так и для 64\-битных программ, ограничение на размер статически выделяемой памяти равно 2 GB\.
* Динамические данные\. Это данные, память на которые динамически выделяется во время исполнения программы\. В C\+\+ такое выделение обычно осуществляется функцией malloc или оператором new\. В 32\-битных программах размер динамически выделяемой памяти ограничен 2 GB, в 64\-битных — 8 TB\.
* Стековые данные\. На них память выделяется при заходе в процедуру и освобождается при её завершении\. Максимальный размер стека программы составляет 1 GB и для 32\-битных, и для 64\-битных приложений\. \(Размер стека задаётся линковщиком и по умолчанию составляет 1 MB\)

У 32\-битного приложения запущенного в 32\-битной Windows суммарный размер всех перечисленных типов данных не должен превышать 2 GB\. \(Практически ограничение равно 1\.75GB из\-за требований к памяти самой операционной системы\) 32\-битная программа, собранная с ключом /LARGEADDRESSAWARE:YES может выделять до 3\-х гигабайт памяти, если 32\-битная операционная система Windows запущена с ключом /3gb\. Эта же 32\-битная программа, запущенная на 64\-битной системе, может выделить почти 4 GB памяти \(на практике около 3\.5 GB\)\.

Заметим, что ограничения на максимальный размер статически\-выделяемой и стековой памяти одинаковы для 32\-х и 64\-х битных Windows приложений\. Это связано с форматом типа файлов Portable Executable \(PE\), который используется в Windows для описания exe и dll файлов\.  Статические и стековые данные располагаются в первых 2\-х GB адресного пространства приложения\.  Стоит помнить, что данные ограничения накладываются самой операционной системой и не зависят от используемого компилятора\.

## Библиографический список

1. Steve Lionel\. [Memory Limits for Applications on Windows](https://software.intel.com/content/www/us/en/develop/articles/memory-limits-applications-windows.html)
1. Андрей Карпов, Евгений Рыжков\. [Урок 2\. Поддержка 32\-битных приложений в 64\-битной среде Windows](https://pvs-studio.ru/ru/blog/lessons/0002/)