динамическое распределение памяти - PullRequest
2 голосов
/ 10 апреля 2010

Когда мы динамически выделяем память, занимает ли память непрерывный сегмент памяти.

Ответы [ 4 ]

4 голосов
/ 10 апреля 2010

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

2 голосов
/ 10 апреля 2010

Вы должны отделить концепцию виртуальной памяти от концепции физической памяти .

Хотя каждый выделенный блок (либо отдельный объект, либо массив объектов) имеет непрерывное виртуальное пространство (начиная с адреса, который вам дает динамический распределитель памяти), он может быть разделен в реальной памяти в соответствии с тем, как Базовая операционная система управляет памятью.

Конечно, если виртуальная память отсутствует, они будут соответствовать, в противном случае она будет смежной для программы, которая ее использует, но не в физической структуре памяти.

2 голосов
/ 10 апреля 2010

Это зависит от того, что именно вы спрашиваете. Например, скажем, у вас есть этот код C:

char* a = malloc(100);
char* b = malloc(100);
* У 1003 * указателей a и b каждому выделено 100 байтов. Тем не менее, вы не можете предполагать, что 100 байтов, выделенных для b, будут сразу после 100 байтов, выделенных для a, или наоборот, или чего-либо, фактически, относительно их позиций относительно друг друга. Так что в этом смысле нет, они не смежные.

Однако в каждом блоке из 100 байтов эти 100 байтов являются смежными с точки зрения вашей программы. То есть a[1] это один байт от a[0] и a[2].

0 голосов
/ 10 апреля 2010

Не обязательно и обычно нет. Могут быть разные механизмы распределения.

Многие будут хранить метаданные между выделенными кусками, разделенными кучами в соответствии с размерами объектов и другими вещами. Вы не можете полагаться на непрерывность возвращаемых указателей.

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