ЦП и выравнивание данных
В этом вопросе Ян Рамин сказал, что некоторые процессоры (инструкции ARM или Intel SSE) требуют выровненной памяти и имеют неопределенную работу при выполнении выровненных обращений (или выбросить исключение). Если бы я использовал пул памяти, который не справляется с этой ситуацией, это ухудшило бы мое приложение?
Использование невыровненной памяти почти всегда будет плохой идеей, не только когда она явно не разрешена. Даже если это не приводит к ошибке, если доступ к памяти пересекает границу строки кэша и в других случаях (см. Комментарий Тони Ди), это будет медленнее, чем если бы это не было. Просто используйте пул памяти, который возвращает выровненные адреса.
Вы можете создать простой выровненный пул памяти, выделив большой кусок байтов с помощью new
и разбить его на заданное количество 4, 8, 16, … байтовых блоков и вернуть наименьшее соответствие. Вы можете использовать растровое изображение, чтобы отслеживать, какие блоки выделены. Я должен сказать, что это неэффективно. Я предполагаю, что это больше для развлечения / обучения, чем для производства, или вы просто использовали бы new
, Кодировать свой собственный распределитель не просто, вы можете посмотреть на реализацию malloc
чтобы понять, что я имею в виду. Это сложный баланс между скоростью, эффективностью пространства и фрагментацией.