Почему размер программы остается неизменным при добавлении большего количества переменных и / или инструкций? - PullRequest
0 голосов
/ 23 ноября 2018

Я начал с «пустой» программы и проверил размер файла .exe

int main()
{
    system("pause");
}

Exe Размер: 58,5 КБ (59 904 байт)

Затем я добавил большоймассив статических переменных

int main()
{
    const int BIG_NUMBER = 40000000;
    static int x[40000000];

    system("pause");
}

Exe Размер: 58,5 КБ (59,904 байт)

Создание нестатического массива также не имело никакого эффекта.Я добавил некоторый код, чтобы (а) убедиться на 100%, что переменная не оптимизирована, и (б) посмотреть, увеличат ли дополнительные инструкции число байтов .exe

int main()
{
    const int BIG_NUMBER = 40000000;
    static int x[40000000];
    for (int i = 0; i < BIG_NUMBER; ++i)
    {
        std::cout << x[i] << std::endl;
    }
    system("pause");
}

Exe Size:58,5 КБ (59 904 байта)

Буквально ни на один байт больше.На данный момент мое (унылое) предположение состоит в том, что .exe запрашивает ОС выделять правильный объем памяти, необходимый для статических переменных при запуске программы, но это кажется неправильным.Что определяет размер файла .exe?

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

От чего зависит размер файла .exe?

Это действительно зависит от того, что вы делаете на самом деле.Но наиболее заметной на сегодняшний день является библиотека, которую вы включили в #include

. Нестатичность массива также не имела никакого эффекта.Я добавил некоторый код, чтобы (а) убедиться на 100%, что переменная не оптимизирована, и (б) посмотреть, не увеличат ли дополнительные инструкции число байтов .exe

Вы включилирежим отладки?Или вы используете режим выпуска?Будьте осторожны, потому что в режиме релиза они оптимизируют ваш код too much.

int main()
{
    const int BIG_NUMBER = 40000000;
    static int x[40000000];
    for (int i = 0; i < BIG_NUMBER; ++i)
    {
        std::cout << x[i] << std::endl;
    }
    system("pause");
}

Ваш код выше содержит только "простые" инструкции, поэтому размер файла не увеличится.

О, да, также примечание, попробуйте использовать std::cin.get() вместо system("PAUSE")

Если вы посмотрите на перспективу сборки, весь ваш код делает это:

allocate 4 bytes of memory at 0xRANDOM address for variable BIG_INT
allocate another 40000000 bytes of memory at 0xRANDOM+4bytes address for variable x
create variable i = 0
create goto address "loop"
output x[i]  // This is also a problem, because x = null!
increment into i by one
if i is less than BIG_INT then jump to "loop"

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

0 голосов
/ 23 ноября 2018

Я скомпилировал вашу программу с большим массивом и без него, сбросил оба заголовка раздела и сравнил их.Это единственное отличие:

     Idx Name          Size      VMA               LMA           File off  Algn
- 23 .bss          09896820  0000000000004020  0000000000004020  00003010  2**5
+ 23 .bss          00000008  0000000000004010  0000000000004010  00003010  2**0

Как вы и подозревали, единственное различие в размерах между ними - это размер блока памяти , который исполняемый файл запрашивает у ОС .Там может быть дополнительный байт или два кода, но, скорее всего, код округляется до ближайшей страницы в любом случае.

Как указано на странице, на которую указывает ссылка:

Как правило, только длинасекция bss, но без данных, сохраняется в объектном файле.Загрузчик программы выделяет память для секции bss при загрузке программы.

...