Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > GNU toolchain > mingw, как задать выравнивание для malloc?


Автор: victor79 5.4.2009, 03:03
программа компилируемая на mingw, по умолчанию malloc выдает выравнивание под 8 байт. А мне для sse нужно 16, может кто знает, есть ли опция такая для компилятора?

Автор: MAKCim 5.4.2009, 09:49
компилятор здесь не причем

Автор: victor79 5.4.2009, 17:31
тут два варианта, либо используется malloc системы виндовс, тогда на него можно воздействовать только если есть такое в винапи, или используется внутренний, тогда возможно по дефайну или по установке переменной. И вопрос есть ли такое, и где его искать? И можно потратить часы на поиск ответа, или вдруг кто уже знает, и можно не тратить на время на поиск ответа.

Автор: Alexeis 5.4.2009, 17:39
  Можно выделить больше памяти и выравнять самому.

Автор: Lazin 5.4.2009, 19:13
есть ф-я VirtualAlloc, с ее помощью можно написать свою версию malloc

Автор: GoldFinch 5.4.2009, 19:41
Цитата(Lazin @  5.4.2009,  20:13 Найти цитируемый пост)
есть ф-я VirtualAlloc, с ее помощью можно написать свою версию malloc 

VirtualAlloc выделяет минимум страницу памяти, 4Кб

для выделения в хипе надо использовать HeapAlloc, который впрочем, и используется стандартным malloc

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

либо вообще отказаться от системного хипа и брать память в заранее выделенном массиве

Автор: Alexeis 5.4.2009, 19:53
Цитата(GoldFinch @  5.4.2009,  18:41 Найти цитируемый пост)
для получения выровненных адресов в хипе видимо следует создать свой хип, и выделять там только куски памяти кратные 16, тогда каждый начальный адрес тоже будет кратен 16

  А как же список блоков? malloc в дебаговой версии выделяет на 10 байт больше для каждого выделения для системной информации, в дебаговой 36 байт сверх. Если при каждой операции выделить памяти на 15 байт больше чем нада, то такой адрес будет гарантированно выравненным, а если известно что malloc выравнивает на границу 8ми байт, то достаточно выделить на 8 байт больше, чтобы прибавить их к указателю в случае если он не выравнен на 16 байт. Но в таком случае придется написать свою функцию освобождения таких блоков, чтобы перед удалением провести обратное смещение на 8 байт.

Автор: GoldFinch 5.4.2009, 20:08
Alexeis, это стандартный маллок чтото выделяет сверх того что ему заказали, а если написать свой этого не будет
Код

inline void* operator new(size_t cb) {
    return (void*)HeapAlloc(myHeap, 0, cb);
};
inline void operator delete(void* ptr) {
    HeapFree(myHeap, 0, ptr);
};

это для С++ но для С принцип тот же

Автор: Alexeis 5.4.2009, 20:16
GoldFinch, и что? Если выделить несколько раз по 16 байт, то будут адреса будут смещены на 16 строго байт? не на 26 или 72?

Автор: GoldFinch 5.4.2009, 20:36
да, действительно, кратность 16 не получается
Код

#include <windows.h> 
#pragma comment(linker,"/ENTRY:main")

int main() {
    HANDLE h=GetProcessHeap();
    HeapAlloc(h, 0, 16);
    HeapAlloc(h, 0, 16);
    HeapAlloc(h, 0, 16);
    HeapAlloc(h, 0, 16);
    HeapAlloc(h, 0, 16);
};

Автор: Alexeis 5.4.2009, 21:17
GoldFinch, HeapAlloc это куча, а все кучи работают сходно, они хранят информацию о блоке памяти в самом блоке. Так эффективнее. Иначе пришлось бы выделять 2 блока памяти один под описатель и один под саму память.

Автор: nickless 7.4.2009, 22:56
Есть еще posix_memalign

Добавлено через 2 минуты и 26 секунд
Мы её кстати как раз для SSE2 и использовали

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)