![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
MemoryManager & MMX [D6, Win2k]
Lis © (2001-12-20 14:51:00)Как заставить MemoryManager выравнивать блоки памяти по 8 бит?
Lis (2001-12-21 18:38:00) [1]Я извиняюсь за опечатку в изначальном вопросе. Конечно требуется выравнивание на 8 байт.
Digitman (2001-12-21 16:59:00) [2]MemoryManager, который Борланд реализует по-умолчанию, выделяет блоки памяти, выравненные на границу двойного слова (DWORD). Динамические массивы используют тот же менджер памяти, а, значит, такде выравниваются на ту же границу. Так что придумывать ничего и не надо.
Единственное, что наводит сомнения - префикс Quad в твоем коде. Вероятно, тебе все же требуется выравнивание не по границе DWORD, а по границе QWORD. Тогда, конечно же, стандартный менеджер не подходит.
Lis (2001-12-21 16:05:00) [3]Поясняю своё решение:
function GetQuadMem(var Mem: Pointer; Size: Integer): Pointer;
begin
GetMem(Mem, Size + 4);
if (Cardinal(Mem) and 4) = 0 then
Result := Mem
else
Result := Pointer(Cardinal(Mem) + 4);
end;
qP := GetQuadMem(mP, 8*N);
// работаем с qP
FreeMem(mP);
Недостатки такого решения:
1. На каждую переменную приходится хранить 2 пойнтера;
2. Динамические массивы не выравниваются.
Попытка аналогичным способом подменить MemoryManager у меня не прошла, посему 2 более конкретных вопроса:
1. MemoryManager один на всю программу или у каждой нитки свой?
2. Какой формат у заголовка блока памяти?
Lis (2001-12-21 14:06:00) [4]Нужно это для того, чтобы быстрее работали команды MMX (у меня на быстром преобразовании Фурье без выравнивания теряется 30%). Я сейчас беру память GetMem"ом и ручками подправляю пойнтер. Хотелось бы избавиться от этой кривизны.
Green (2001-12-21 11:33:00) [5]Интересно, а что мешает использовать динамические массивы однобайтовых величин, если каждый элемент не выровнен на границу слова (двойного слова и т. д.)????
Владислав (2001-12-21 09:12:00) [6]> MBo © (21.12.01 06:59)
...использования массива записей размера, кратного 8 байт или даже array of double...
А это разве поможет для выравнивания?
MBo (2001-12-21 06:59:00) [7]а для какой цели это нужно?
может, что-нибудь примитивное подойдет
типа использования массива записей размера, кратного 8 байт или даже
array of double
и приведения типов
Владислав (2001-12-21 06:48:00) [8]А какая разница? VirtualAlloc выравнивает аж на 64 kB.
Lis (2001-12-20 18:56:00) [9]Спасибо, но я спрашивал о другом. Хотелось бы заставить заниматься выравниванием именно менеджер, чтобы, например, использовать динамические массивы.
Владислав (2001-12-20 15:08:00) [10]Используй VirtualAlloc из API.