Размеры массивов и памяти

"Играясь" над очередным проектецом, меня заинтересовал вопрос. Кто из компиляторов всех мудрее, экономней и милее? Проверять я решил следующим образом: берем очередную студию и делаем два проекта -
- Первый проект - пустой проект.
- Второй проект - добавляем в новый проект указатель на массив размера 100000

Теперь производим сравнение полученных размеров и вычисляем разницу между потребляемой ОЗУ.
Проведем вначале "скроменые" подсчеты. Размер массива = 100 000 умножаем его на 32 бита (система 32 бит) и получаем 32 000 000 бита = 4 млн байт = 3906,25 Кб > 3 Мб
То есть ожидаемый "прирост" размеров = 3900 Кбайт.

Подопытные

В качестве подопытных возьмем популярнейшие студии
- Qt
- Delphi
- Visual C++
- Visual C#

Qt

  1. #include  <QtCore/QCoreApplication >
  2. #include  <conio.h >
  3. int main(int argc, char *argv[])
  4. {
  5. QCoreApplication a(argc, argv);
  6. int *aa = new int[100000];
  7. getch();
  8. return a.exec();
  9. }

This code was highlighted with code.xnim.ru

Размер ОЗУ пустого проекта = 544 Кб
Размер ОЗУ с массивом = 944 Кб
Разница после "добавления" массива = 400 Кб
Visual C++

  1. #include <conio.h >
  2. int main()
  3. {
  4. int *a = new int[100000];
  5. getch();
  6. return 0 ;
  7. }

This code was highlighted with code.xnim.ru

Размер ОЗУ пустого проекта = 236 Кб
Размер ОЗУ с массивом = 632 Кб
Разница после "добавления" массива = 396 Кб
Visual C#

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace MemTestCS
  6. {
  7. class Program
  8. {
  9.    static void Main(string[] args)
  10.    {
  11.    int[ ] a = new int[ 100000];
  12.     Console.ReadLine();
  13.    }
  14. }
  15. }

This code was highlighted with code.xnim.ru

Размер ОЗУ пустого проекта примерно 4000 Кб
Размер ОЗУ с массивом примерно 4000 Кб
Здесь следует сказать следующее. Размер потребляемой ОЗУ изменяется от 3,7 тыс. Кб до 4 тыс.Кб, причем при генерации массива размер увеличивается незначительно (около 12 Кбайт, также нельзя точно замерить)
Delphi XE

  1. {$APPTYPE CONSOLE}
  2. var a:array of integer;
  3. begin
  4. SetLength(a,100000);
  5. readln;
  6. end.

This code was highlighted with code.xnim.ru

Размер ОЗУ пустого проекта = 400 Кб
Размер ОЗУ с массивом = 840 Кб
Разница после "добавления" массива = 440 Кб

Итак, можно заметить, что каждый компилятор имеет "внутренние" средства оптимизации и не выделяет память в полном объеме. Если попытаться обратиться ко всем элементам, размер увеличится более чем на 3 Мб. Если интересно, можно будет также проверить. =)


В целом, все компиляторы показали себя с хорошей стороны. Большое поедание C# памяти объясняется использованием managed кода, включением GC и прочих прелестей.
Все компиляторы практически "идут" на равне - размеры разнятся до и после примерно на 400 Кб.
2012-03-31