Malloc () "совершенная эффективность" VS автоматические переменные - PullRequest
0 голосов
/ 12 декабря 2010

У меня была привычка какое-то время вызывать malloc. Тогда до меня дошло, что если в коде нет критически важного для производительности раздела, почему бы не использовать еще пару килобайт в автоматическом режиме и потерять точность объема памяти, который мне нужен (потенциально) для процедуры malloc? Таким образом, без заметного влияния можно сделать намного более читаемый код. например временное копирование строки для манипулирования ею в функции, которая вызывается очень редко.

Моя логика звучит?

Ответы [ 3 ]

3 голосов
/ 12 декабря 2010

Локальные переменные хранятся в стеке, что ограничено. malloc () выделяет память из кучи, которая также ограничена, но содержит гораздо больше памяти.

Обычно я не использую malloc (), если только объем памяти не превысил бы то, что я мог бы безопасно хранить в стеке.

Для разработки под Windows стеки обычно довольно большие. Вы можете хранить буфер размером до пары сотен байтов без особых проблем (при условии, что функция никогда не будет вызываться рекурсивно).

Но, как правило, если мне нужно больше, скажем, 50 байтов, я обычно использую malloc ().

1 голос
/ 12 декабря 2010

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

malloc((foo * 2 + 6) * sizeof(char))

С

char big_enough[2000];

Что касается потерь - нет ничего плохого в том, чтобы тратить пару байтов время от времени, но если вы будете делать это все время, это начнет складываться.

Но более серьезная опасность заключается в том, что вам нужно быть уверенным, что этого всегда будет достаточно. Использование константы опасно - может показаться, что 2000 байтов должно быть достаточно, но вы уверены, что невозможно для кого-то, кому нужно больше? Помните, что этот вид кода может легко создать уязвимости переполнения буфера, и работа, которую вы сохранили, не вычисляя правильный размер, вероятно, меньше, чем объем дополнительной работы, которую вам теперь нужно сделать, чтобы убедиться, что каждый буфер не переполняется время, когда вы читаете или пишете в него.

1 голос
/ 12 декабря 2010

Большинство версий реализации malloc() на самом деле не выделяют точную сумму, которую вы указали, но фактически выделяете больше, обычно с шагом в размере блока.Это дает повышение производительности, если вам нужно сделать небольшое перераспределение.Так что с самого начала не было никакой «точности» с

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...