Несколько странной показалась мне работа с памятью..
Программа до смешного простая: в цикле аллоцирует память по элементам массива длины m. Каждый элемент - упакованный в структуру массив длины L. Цель программы - продемонстрировать ученику работу с динамической памятью.. В качестве самого первого приближения использую конструкцию с malloc(). Код, как результат импровизации, вышел неким гибридом C и C++ (так сказать, C+-)) Для наглядности я открыл TaskManager на закладке Performance. При m=2000 и L=106 я ожидал, что используемая память вырастет на 2 ГБ. Вставил задержку в цикл аллокации памяти, чтоб был наклон графика памяти. Думаю - сейчас мой ученик все увидит своими глазами. Запускаю прогу..
Ага, разбежался! Кривая графика памяти даже не шелохнулась..
Ход мысли такой: БЛИН!!!!!!!!!!!!!!!!! ГДЕ-ТО ОШИИИИИИБКА!! КЭШМЭРР!!
Если ошибка, то при использовании взятой памяти будет сбой. Я добавляю в цикл присвоение константы случайному элементу внутреннего массива. Никаких сбоев - все пашет на ура..
Дальнейший ход мысли: НАДО ДЕБАГГИТЬ..
При отладке замечаю, что вся аллоцированная память инициализирована нулями.. Что ж, если так, то она может быть и упакована. Вставляю в цикл инициализацию всего массива, и..
О, СЧАСТЬЕ!! наконец-то моя программа начинает ЖРАТЬ ПАМЯТЬ! Сжирает ровно столько, сколько положено (а чудес я и не ждал)). Если же я делаю заполнение половины массива, то получаю половинный расход памяти.
Первый пик - инициализавция всего массива (почти, то есть через один элемент), второй - только первой половины, третий - только второй половины.
Вопрос, я полагаю, вы уже поняли. Кто занимается этим грязным бизнесом - компилятор или система? И вообще - какого, извините, черта?
Компилятор - gcc (MinGW + C::B). Debug и Release ведут себя одинаково (в среде и без).
OS - Windows 7 Pro 64
Странности при работе с динамической памятью, С/С++ |