У меня есть несколько связанных вопросов об управлении выровненными блоками памяти. Кросс-платформенные ответы были бы идеальными. Однако, поскольку я уверен, что кросс-платформенное решение не существует, меня в основном интересуют Windows и Linux, а также (в гораздо меньшей степени) Mac OS и FreeBSD.
-
Какой лучший способ получить кусок памяти, выровненный по 16-байтовым границам? (Я знаю о тривиальном методе использования
malloc()
, выделяя немного дополнительного пространства, а затем набрасывая указатель до правильно выровненного значения. Я надеюсь на что-то немного меньше kludge-y. ниже для дополнительных вопросов.) -
Если я использую простой старый
malloc()
, выделите дополнительное пространство, а затем переместите указатель вверх туда, где он будет правильно выровнен, нужно ли держать указатель на начало блока вокруг для освобождения? (Вызовfree()
по указателям на середину блока, похоже, работает на практике в Windows, но мне интересно, что говорит стандарт, и даже если стандарт говорит, что вы не можете, работает ли он на практике по всем основным OS. Я не забочусь о неясных DS9K-подобных ОС.) -
Это трудная/интересная часть. Какой лучший способ перераспределить блок памяти при сохранении выравнивания? В идеале это было бы более разумным, чем вызов
malloc()
, копирование, а затем вызовfree()
на старый блок. Я хотел бы сделать это на месте, где это возможно.