Выделять большие блоки смежной памяти - делать или нет?

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

Недавно я пришел через библиотеку обработки изображений ITK и понял, что они (практически) всегда выделяют данные изображения (даже 3D - которые могут быть огромными), как один непрерывный блок. Мне сказали, что это не должно быть проблемой, по крайней мере для 64-битных процессов. Однако я не вижу систематического различия между 64-битными и 32-битными процессами, кроме того, что проблемы с памятью могут задерживаться из-за большего виртуального адресного пространства.

Чтобы понять суть вопроса: интересно, какая хорошая практика при работе с большими объемами данных: просто выделите ее как один большой блок или лучше разделите на более мелкие куски для выделения?

Поскольку вопрос, конечно, скорее системный, я хотел бы ограничить его встроенным (неуправляемым, без CLR) С++, особенно под окнами. Тем не менее, я был бы также заинтересован в любых более общих комментариях - если это возможно.

Ответ 1

Вопрос почти кажется бессмысленным... позвольте мне перефразировать его, чтобы проиллюстрировать:

Если вам нужен большой блок памяти и вы беспокоитесь о фрагментации, вы должны просто его фрагментировать?

Вы ничего не получаете, разбирая его самостоятельно, а не позволяя диспетчеру системной памяти фрагментировать его для вас. Система очень хороша в этом, и вы вряд ли сделаете это лучше.

Говоря, что если все вещи равны, вы можете сделать одну и ту же задачу, но разбить на разумные фрагменты, возможно, стоит профилировать, чтобы увидеть, можете ли вы что-либо получить. Но в целом вы не получите ничего в разумном смысле - вы не сможете превзойти ОС.