как скомпилировать, чтобы уменьшить объем памяти / СТЕКА, похоже, ничего не меняет?

#c #c #compilation

#c #c #Сборник

Вопрос:

Я создаю множество простых программ, которым не нужна память, но они всегда показывают около 1 МБ-1,6 МБ памяти в столбце частная память в диспетчере задач.

Я читал, что размер стека по умолчанию равен 1 МБ для связывания с link.exe я попытался поиграть с / STACK следующим образом :

 /STACK:65536 (64kb)
/STACK:16777216 (16mb)
  

когда я запускаю программу, объем памяти вообще не изменился..

Даже такая простая программа, как эта, использующая 1,6 МБ, скомпилированная как 64-битная с link.exe и никаких библиотек (simple.c):

 #include <stdio.h>

int main() {
  puts("hello worldn");
  getchar();
  return 0;
}
  

Кто-нибудь может сказать мне, как я могу уменьшить объем памяти в простых программах? я знаю, что 1 мб — это немного, но мне очень любопытно, поскольку есть некоторые процессы Windows, которые показывают очень мало памяти в taskman, например smss.exe использует 0,4 МБ частной памяти с 2 потоками.

Спасибо!

Комментарии:

1. Использует ли РЕЛИЗНАЯ сборка меньше памяти?

2. это в режиме выпуска, x64. кажется, всегда составляет 0,8 мб, попробовал запись WINAPI, чтобы посмотреть, использует ли консоль что-либо, но все еще 0,8 мб…

3. Какой в этом смысл? Если ваш компьютер скачивает страницы как сумасшедший, потому что ему не хватает памяти, оптимизация ваших игрушечных программ объемом 1 МБ — неправильный путь.

4. Что плохого в том, что программист понимает больше? Не Всем приходится ждать, пока это станет критичным для улучшения.

Ответ №1:

Вы можете уменьшить размер отпечатка, если не включите stdlib и убедитесь, что не ссылаетесь на библиотеки, которые вы не используете. Все связанные библиотеки dll получают собственный сегмент личных данных, и я полагаю, что он включен в ваш личный набор.


После удаления всех стандартных библиотек с помощью Yes (/ NODEFAULTLIB), установив для моей оптимизации значение O1 и установив точку входа winmain, чтобы избежать @_crtstatuperror с использованием этого кода

 #include <windows.h>

int winmain(    HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR lpCmdLine,
    int nCmdShow)
{

    HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);
    char out[] = "bob";
    DWORD Outchar = 0 ;    
    WriteConsole(h, out, 4, amp;Outchar,  NULL);
    return 0;
}
  

Я снизил использование памяти до 292 КБ, не становясь по-настоящему экзотическим, я не думаю, что вы могли бы снизить его намного

Комментарии:

1. @Kaije: Да, вы ссылаетесь. Попробуйте /NODEFAULTLIB и увидите, что компоновщик больше не находит некоторые символы.

2. Я просто устал от отсутствия библиотек по умолчанию и не использования консольных команд Windows, и у меня было 400 кб, когда я добавил stdio.h он поднялся только до 500, я использовал release build с оптимизацией o1.

3. я попробую / O1 с /NODEFAULTLIB, я получаю ССЫЛКУ: ошибка LNK2001: неразрешенный внешний символ mainCRTStartup, какая библиотека отсутствует?

4. с / O1 я по-прежнему получаю 0,8 МБ o.o

Ответ №2:

Вы также можете попробовать уменьшить размер вашей кучи. Для Visual Studio это можно сделать с помощью параметра /HEAP . (По умолчанию куча равна 1 МБ.)

Комментарии:

1. о, о.о. я думал, куча не является фиксированной вещью

2. и я только что попробовал, частная память все та же с 64 КБ в куче, просто снова запустил тот же exe, и объем памяти теперь составляет 0,8 МБ, случайным образом..

3. нет, старый exe-файл с кучей и стеком по умолчанию по какой-то причине также составляет 0,8 мб