Выравнивание памяти на iPhone и Android - PullRequest
7 голосов
/ 06 марта 2011

Как я выяснил из моих тестов, malloc для iPhone имеет 16-байтовое выравнивание. Но я не уверен, гарантировано ли это или просто совпадение.

Итак, вопрос: что такое гарантированное выравнивание памяти при использовании malloc () на iOS и Android (NDK)?

Ответы [ 3 ]

6 голосов
/ 06 марта 2011

На iOS, как вы обнаружили, выравнивание в настоящее время составляет 16 байт. Однако это не гарантировано и не задокументировано. То есть не надейся на это.

Предполагая, что это доступно на iOS, posix_memalign() позволяет выделять специально выровненную память. Могут быть и другие механизмы.

Android не мой бейливик.

5 голосов
/ 06 марта 2011

malloc в C возвращает указатель на блок памяти, «который соответствующим образом выровнен для любой переменной»;является ли это выравнивание или останется в 16 байтах, не гарантируется даже для разных версий одной и той же ОС.Objective-C эффективно основан на C, так что и там он должен сохраняться.

Если ваш Android NDK написан на C или C ++, то же самое должно быть и там.

1 голос
/ 22 марта 2013

Я бы согласился, что вы все равно не должны полагаться на это, но для чего-то вроде хеш-функции это довольно полезно.

Это действительно задокументировано - https://developer.apple.com/library/ios/#documentation/performance/Conceptual/ManagingMemory/Articles/MemoryAlloc.html

Выдержка:

Выделение небольших блоков памяти с помощью Malloc

Для небольших выделений памяти, где small - это меньше, чем несколько страниц виртуальной памяти, malloc перераспределяет запрошенный объем памяти из списка (или «пула») свободных блоков увеличивающегося размера. Любые небольшие блоки, которые вы освобождаете с помощью бесплатной подпрограммы, добавляются обратно в пул и используются повторно для наилучшего соответствия. Сам пул памяти состоит из нескольких страниц виртуальной памяти, которые выделяются с помощью процедуры vm_allocate и управляются для вас системой.

При выделении любых небольших блоков памяти помните, что гранулярность для блоков, выделенных библиотекой malloc, составляет 16 байтов . Таким образом, наименьший блок памяти, который вы можете выделить, составляет 16 байтов, а любые блоки, размер которых больше этого числа, кратны 16. Например, если вы вызываете malloc и запрашиваете 4 байта, он возвращает блок, размер которого составляет 16 байтов; если вы запрашиваете 24 байта, он возвращает блок, размер которого составляет 32 байта. Из-за этой детализации вы должны тщательно проектировать свои структуры данных и стараться делать их кратными 16 байтам, когда это возможно.

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