Здравствуйте.
Как известно, решение задачи должно укладываться в определенные рамки времени работы и используемой памяти. Причем, чаще всего первое критичнее. Но не всегда.
В С++ можно следить за временем работы твоей программы, используя хотя бы clock(). А вот можно ли как-нибудь посмотреть, сколько памяти используется, проверить влезает ли программа в ML? Ну или хотя бы локально поставить такие ограничения?
Спасибо.
Если мне память не изменяет, то в C/C++ портабельного способа нет.
Количество доступной памяти можно, пожалуй, замерить если в цикле выделять и освобождать всё большие куски пока malloc не вернёт NULL.
А уж попытаться замерить сколько памяти уже использовано (кроме как нахождением разности доступной памяти в начале и в конце) — это по-моему дело страшное и платформозависимое.
Но вы же сами память выделяете — что вам мешает её считать и оценивать приблизительно? С этим даже в java с грехом пополам можно справиться по-моему (хотя "песочницы" на разных сайтах почему-то очень по-разному считают результат порой). А в C/C++ всё ощутимо прозрачнее, вроде. Ну просто оцените заранее сколько дополнительной памяти расходуют stl-ные структуры которыми вы пользуетесь и из этого исходите. Кажется так.
А средствами линукса что-нибудь можно сделать?
Не совсем средствами Linux, но только под Linux — попробуйте Valgrind.
На уровне логики приложения можно попробовать перегрузку new/delete, кастомные аллокаторы.
Как вариант — читать информацию о памяти из /proc/self/statm.
Насчет линукса: насколько я помню, можно использовать функцию getrusage(int, struct rusage *), правда, она меряет много разной памяти. В качестве первого параметра передается константа, обозначающая, для какого процесса мы заполняем структуру, указатель на которую мы передаем в качестве второго параметра.
Пример:
Подробнее в манах)
В Linux этот способ обычно не работает, поскольку Linux позволяет "выделять" памяти сколько хочешь — настоящее выделение произойдёт только тогда, когда в новую область будет что-то записано. См. linux memory overcommit.
Стандартный способ — поставить в конце программы
while(1);
и посмотреть на реальное использование памяти процессом, запустивtop
под линуксом, либо в task manager (ctrl-shift-esc) под виндой.В Linux есть программа GNU time, которая запускает процесс и потом выводит по нему статистику. Время работы и использованную память (максимальный RSS за время работы программы) можно получить так:
command
нужен для того, чтобы обойти встроенную команду bash и вызвать именно GNU time.с помощью функций sizeof можно определить сколько байтов занимает массив