· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› Выравнивание данных

Посл.отвђт Сообщенiе


Дата: Окт 31, 2004 18:30:45

Все знают что при компилляции можно указать выравнивание структур данных по 1, 2, 4 и 8 байтовой границе. Проблема в том, что в одной ДЛЛ может быть установлено 4х байтововое выравнивание, а в другой 1 байтовое и т.д.
Например, если при компиляции своего проекта указать "неверное" выравнивание структур данных, то при вызове экспортируемой функции из DLL можно повредить стек со всеми вытекающими...

Какаким образом и откуда я могу узнать по какой границе выравнивались данные в той или иной библиотеке? например в наличии имеется DLL, LIB и .H файлы.

Спасибо!


Дата: Окт 31, 2004 20:32:15

Чего??? какое выравниевание? Если написать
A dd 0
B db 1
то это будет структура из 5-и байт независимо от выравнивания. Возможно имеется ввиду выравнивание начала структур по границе, кратной какому-нить числу.


Дата: Окт 31, 2004 20:55:40

имеется ввиду только то, что написано.


Дата: Окт 31, 2004 21:31:38

2 Turkish
если выравнивание равно 1, то это структура из 5 байт, а если 4 - то из восьми! Я сам с этим продолбался два дня, пока понял, в чем дело... Сумма размеров всех полей структуры равнялась 512 байт, но сама структура в памяти занимала 520 байт, соответственно, и на диск вместо одного сектор азаписывалось 1 сектор и еще 8 байт. Задолбался, пока нашел... Так что зря ты так... ;-)


Дата: Ноя 1, 2004 14:59:11

Если здесь говорится про компилятор "C", а не ассемблер, то прямо в коде нужная структура окружается командами pragma:
#pragma pack (1) // Align on 1 byte
typedef struct tag_ITEM {
  char ProductCode [3];
  char ProductType;
} ITEM;
#pragma pack (8) // Align on 8 bytes


Дата: Ноя 1, 2004 16:08:48

я спрашивал о том, как и где достать инфу о том как выровнены данные в DLLках если в наличии есть собсно ДЛЛки, их ЛИБы и куча .Н файлов.

похоже что нигде и никак =(


Дата: Ноя 1, 2004 16:55:47

А в хидерах разве нет структур ?!


Дата: Ноя 1, 2004 17:43:00

[quote][/quote]
а что такое "структур"? 8)

ладно тема закрыта... буду ковыряца сам


Дата: Ноя 1, 2004 17:45:08

„#pragma pack (8) // Align on 8 bytes“
правильнее было бы написать #pragma pack(pop) а в начале #pragma pack(push, 1)
S_T_A_S_
наверняка есть и если все пИсано по уму то и с прагмами :)


Дата: Ноя 1, 2004 20:26:52

вообще то по умолчанию все ДЛЛки в винде имеют выравнивание 4 байта. если только самому не поизвращаться в _своей_ ДЛЛке.


Дата: Ноя 1, 2004 23:23:13


вообще то по умолчанию все ДЛЛки в винде имеют выравнивание 4 байта. если только самому не поизвращаться в _своей_ ДЛЛке.


мне нельзя полагаться на "умолчание", очень часто это "умолчание" идет лесом...


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.055