2017-02-10 6 views
-1

Я всегда предполагал, что malloc возвращает выделенный блок памяти с адресом, который выровнен на 16 байт для 64-битных систем, используя как Visual Studio, так и gcc. Тем не менее, я читал некоторые противоречивые статьи по этому вопросу. Сайт MSDN очень прост в этом, но документация GNU намного более «нюансирована».Что такое выравнивание байтов выделенного блока памяти на 64-битных платформах?

Любые разъяснения были бы наиболее полезными.

Большие ответы здесь:

Aligned memory management?

+1

Помогает ли это? https://www.gnu.org/software/libc/manual/html_mono/libc.html#Aligned-Memory-Blocks – Milack27

+1

gcc не предоставляет стандартную библиотеку. Вы должны прочитать документацию 'glibc'. Но на самом деле возникает вопрос: почему вас это вообще волнует? 'malloc' гарантирует, что возврат блока корректно выровнен для любого типа вашей платформы. Если этого недостаточно, либо 'malloc' самостоятельно не подходит, либо вы должны пересмотреть свой дизайн. И: В какой документации вы читали? Что конкретно ** ** не ясно? Что вы имеете в виду «намного больше нюансов»? – Olaf

+0

@Olaf Теперь у нас есть 64-байтные (512-битные) типы векторов, поэтому «выровненный для любого типа данных вашей платформы» дико оптимистичен. Microsoft уникальна тем, что «malloc» не имеет значения. – Potatoswatter

ответ

1

malloc возвращает указатель с фундаментального выравнивания (C11 §7.22.3), которая является выравнивание max_align_t (C11 6.2.8). Это зависит от операционных систем, и в Windows это недостаточно для SSE.

Есть various options, но если это для SSE, мне кажется, что хорошим подходом было бы позвонить _mm_malloc и _mm_free. При желании используйте макросы для сопоставления этих имен соответствующим средствам на платформе, таким как _aligned_malloc.

+0

Спасибо за нижний план. Что это за ложь? – Potatoswatter

+0

Почему бы не использовать стандартную функцию 'aligned_alloc' вместо того, чтобы полагаться на детали платформы? И фундаментальное выравнивание не означает гарантию 'max_align_t'. Это минимальное гарантированное выравнивание. – Olaf

+0

@Olaf Потому что это C11, и не все производители платформ тоже борются с этим. – Potatoswatter

0

Выравнивание гарантировано подходит для любых целей. Обычно это 8 байт. Однако это может измениться по мере появления новых компиляторов. Большие распределения могут также соответствовать границам страниц из-за того, как работают алгоритмы распределения памяти.

+0

Это то, что я имею в виду под нюансом. Каждый опыт, который у меня был с 64-битными машинами с использованием gcc и VS, был выровнен по 16 байт для двухсловных или qaud типов слов. – cdcdcd