Распределение памяти - адреса, кратные 4 - PullRequest
0 голосов
/ 12 марта 2011

Мне нужно выделить 4 байта памяти, а адрес выделенной памяти должен быть кратным 4. Например: 400, 404,408,40c

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

Так что кто-нибудь может предложить этот дизайн.

Ответы [ 3 ]

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

В компиляторе Microsoft C / C ++ вы можете использовать _aligned_malloc и в Linux posix_memalign .

MSVC:

ptr = _aligned_malloc(4, 4);

Подпись:

void * _aligned_malloc(size_t size, size_t alignment);

Linux:

posix_memalign(&ptr, 4, 4); // returns 0 if successful

Подпись (порядок примечаний обратный, сравнивается с MSFT):

int posix_memalign(void **memptr, size_t alignment, size_t size);
2 голосов
/ 12 марта 2011

Добавьте 3 к сумме выделения.Выделите память.Если возвращенный адрес не кратен 4, округлите его до тех пор, пока он не будет получен.(Максимум, что вам нужно округлить - это 3, поэтому вы заранее увеличиваете свое распределение.)

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

0 голосов
/ 24 октября 2011

Гай Сиртон дал правильный ответ, но он неоднозначен и может привести к потенциальной ошибке.
В приведенном здесь примере показано значение 4 для размер и выравнивание .
Но действительные аргументы _aligned_malloc() и posix_memalign() обращены вспять:

  • _aligned_malloc( size_t size, size_t alignment )
  • posix_memalign(void **memptr, size_t alignment, size_t size)

Лучший пример - несимметричный, например:

size_t alignment = 16; // Must be a power of 2
size_t size = 10;      // Not necessarily a power if 2

#ifdef _MSC_VER
  ptr = _aligned_malloc(size, alignment);
#else
  posix_memalign(&ptr, alignment, size); 
#endif
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...