#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 мб