Просто укажите точный размер, который вам нужен. Единственная причина, по которой размер степени двойки может быть «лучше», состоит в том, чтобы обеспечить более быстрое выделение и / или избежать фрагментации памяти.
Однако любая нетривиальная реализация malloc
, которая касается эффективности, будет внутренне округлять распределения таким образом, если и когда это будет уместно. Вам не нужно заботиться о «помощи» malloc; malloc может справиться самостоятельно.
Edit:
В ответ на вашу цитату из статьи о Джоэле о программном обеспечении Джоэл указывает в этом разделе (который трудно правильно разглядеть без контекста, который следует за абзацем, который вы цитировали), что если вы ожидаете частого повторного - выделить буфер, лучше делать это мультипликативно, а не аддитивно. Это именно то, что делают классы std::string
и std::vector
в C ++ (среди прочих).
Причина, по которой это улучшение, не в том, что вы помогаете malloc
, предоставляя удобные номера, а в том, что выделение памяти - это дорогая операция, и вы пытаетесь свести к минимуму количество раз ты делаешь это. Джоэл представляет конкретный пример идеи пространственно-временного компромисса. Он утверждает, что во многих случаях, когда объем необходимой памяти изменяется динамически, лучше тратить некоторое пространство (выделяя вдвое больше, чем нужно при каждом расширении), чтобы сэкономить время , которое потребуется многократно использовать ровно n
байтов памяти, каждый раз, когда вам нужно n
больше байтов.
Множитель не обязательно должен быть равен двум: вы можете выделить до трех раз больше места, чем вам нужно, и в конечном итоге выделите в степени три, или выделите в пятьдесят семь раз больше места, чем вам нужно и в конечном итоге с распределениями в полномочиях пятьдесят семь. Чем больше перераспределения вы делаете, тем реже вам придется перераспределять, но тем больше памяти вы будете тратить. Распределение по степеням двух, при котором используется не более чем вдвое больше памяти, чем необходимо, просто является хорошим отправным пунктом до тех пор, пока у вас нет лучшего представления о ваших потребностях.
Он мимоходом упоминает, что это помогает уменьшить «фрагментацию в свободной цепочке», но причина этого кроется скорее в количестве и однородности выполняемых распределений, а не в их точном размере. Во-первых, чем больше вы выделяете и освобождаете память, тем больше вероятность того, что вы фрагментируете кучу, независимо от того, какой размер вы выделяете. Во-вторых, если у вас есть несколько буферов, которые вы динамически изменяете с использованием одного и того же алгоритма мультипликативного изменения размера, то вполне вероятно, что если один из них изменяет размер с 32 до 64, а другой изменяет размер с 16 до 32, то перераспределение второго может подходить там, где первый раньше был. Этого не произошло бы, если один из них изменил размеры с 25 до 60, а другой с 16 до 26.
И снова, ни одно из того, о чем он говорит, не применимо, если вы собираетесь выполнить шаг распределения только один раз.