выравнивание и распределение памяти против malloc - PullRequest
2 голосов
/ 22 июня 2011

Я пишу библиотечную функцию на C, которая будет возвращать блоки по 32 бита.Я использую malloc () для этой цели.Будет ли следующее всегда гарантировать, что 32 бита памяти были выделены непрерывным образом?

char *base_ptr = (char*)malloc(4*sizeof(char))?

Как мне убедиться, что он выделен на границе 4 байта?

Ответы [ 5 ]

3 голосов
/ 22 июня 2011

Да.Вы получите непрерывный блок 4 байта памяти.

Не 32 байта.Если вы имели в виду 32 бита, то это не гарантируется, но на обычном настольном компьютере CHAR_BIT равно 8, а затем, да, ваши 4 байта равны 32 битам.

2 голосов
/ 22 июня 2011

Да, это будет смежно - НО это не обязательно будет размещаться на границе 4 байта.

1 голос
/ 22 июня 2011

sizeof(char) всегда 1.Нет причин писать это в вашем коде вообще.Приведение возвращаемого значения malloc() также считается плохим стилем для многих.

Если вам нужно максимально приблизиться к 32 битам (минимальные издержки), и вы хотите быть чрезвычайно переносимымоб этом, вы, вероятно, хотите что-то вроде:

char *base_ptr = malloc((32 + CHAR_BIT - 1) / CHAR_BIT);
1 голос
/ 22 июня 2011

это 4 байта.если вы хотите, чтобы 32 байта были смежными, то вы должны изменить 4 на 32.

нет никакой гарантии, что один вызов malloc будет распределен непрерывно после следующего и фактически реализации блоков pad.

0 голосов
/ 22 июня 2011

Обращаясь к слову «выравнивание» в заголовке.

Стандарт malloc не дает никаких гарантий относительно выравнивания возвращаемого распределения. Конкретные реализации могут или не могут делать полезные вещи в этой области, и могут иметь или не иметь какое-то расширение, чтобы позволить вам управлять выравниванием возвращаемых блоков. Однако эти вещи не будут переносимыми.

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

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