Помогите разобраться с выравниванием данных
Релиб
Форумы       Участники    Календарь    Кто он-лайн?
Добро пожаловать, гость ( Вход | Регистрация )
        



Помогите разобраться с выравниванием данных Expand / Collapse
Автор
Сообщение
09.05.2007 20:44


Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 14.05.2008 23:42
Сообщ.: 121, Visits: 2 333
Здравствуйте.
Помогите, пожалуйста, у меня уже голова кругом. В приложении кусок кода. Компилятор C++ Bulder 6. Пытаюсь выровнять данные по границе 16 байт. По всем признакам, это делается директивой #pragma pack(16), однако данные не хотят выравниваться. Я уже добавил лишние float Unused[7] для дополнения структуры до размера, кратного 16 байтам, но все равно не помогает.
Может, кто-нибудь сталкивался с подобным? Хотя бы что можно еще попробовать?
Может быть, можно выделить память с помощью GlobalAlloc с выравниванием?

 

  #pragma pack(push,16)
  struct SSE_128AlignedData
  {
    float Data[9];
    float Unused[7];
  };
  static SSE_128AlignedData Koef;
  static SSE_128AlignedData CR;
  static SSE_128AlignedData CG;
  static SSE_128AlignedData CB;
  #pragma pack (pop)

  /*ShowMessage("Koef = 0x"+IntToHex((int)&Koef,8)+
              "  CR = 0x"+IntToHex((int)&CR,8)+
              "  CG = 0x"+IntToHex((int)&CG,8)+
              "  CB = 0x"+IntToHex((int)&CB,8));*/

  if((DWORD)&Koef % 16 ||
     (DWORD)&CR % 16 ||
     (DWORD)&CG % 16 ||
     (DWORD)&CB % 16) Beep(1000,100);

Сообщ. #913136
09.05.2007 23:58
Forum Guru

Forum GuruForum GuruForum GuruForum GuruForum GuruForum GuruForum GuruForum Guru

участник
Last Login: 11.07.2008 23:27
Сообщ.: 60, Visits: 638
Ну так а в чем проблема? Как раз эта структура и кратна 16 байтам и без прагмы
struct SSE_128AlignedData
{
float Data[9];
float Unused[7];
};

std::cout << sizeof(SSE_128AlignedData) / 16 << std::endl;

Выведет 4

Ты напиши, что тебе нужно сделать, а то не совсем понятно
Сообщ. #913138
10.05.2007 0:48


Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 14.05.2008 23:42
Сообщ.: 121, Visits: 2 333
Проблема не в этом. Размер структуры мне не так важен. Надо чтобы структура располагалась в памяти по адресу, кратному 16 байтам.

Поэтому я делаю проверку (DWORD)&Koef % 16 == 0, т.е. остаток от деления адреса структуры на 16 должен равняться нулю.

Сообщ. #913139
11.05.2007 12:14
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

модератор
Last Login: 09.07.2008 2:17
Сообщ.: 1 298, Visits: 12 500
Вот тут есть пример работы #pragma pack(1):
http://publib.boulder.ibm.com/infocenter/macxhelp/v6v81/topic/com.ibm.vacpp6m.doc/compiler/ref/rnpgpack.htm

по-моему там выравнивание не адреса по которому распологаются объекты структуры, а выравниваение адресов по которому располагаются элементы структуры относительно друг друга

С уважением,
Владимир
Сообщ. #913174
11.05.2007 12:25
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

модератор
Last Login: 09.07.2008 2:17
Сообщ.: 1 298, Visits: 12 500
Похоже, что в Borland Builder #pragma pack работает похожим образом:

http://faqs.org.ru/progr/c_cpp/cbuilder.htm


>Q9: Почему в билдере размер структуры всегда растягивается до кратного
> 4-ем?

A: Из-за выравнивания (RTFM Data Alignment).
Чтобы поля структуры выравнивались на 8-ми битную границу, необходимо
использовать следующую конструкцию:

#pragma pack(push, 1)

#pragma pack(pop)

Менять выравнивание для всего проекта (Project Options\Advanced Compiler\
Data Alignment) не рекомендуется.
Сообщ. #913175
11.05.2007 23:11


Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 14.05.2008 23:42
Сообщ.: 121, Visits: 2 333
Да, спасибо, насчет #pragma pack мне уже подсказали. Остается способ выделять память GlobalAlloc, чуть большую, чем нужно, потом сдвигаться до адреса, кратного 16. Но этот вариант меня не совсем устраивает по ряду причин. Очень жаль, что нет такой простой директивы препроцессора.
Сообщ. #913186
« пред. тема | след. тема »


Эту тему читают Expand / Collapse
Посетители: 0 (0 гостей, 0 участников, 0 скрыт.участников)
Сейчас нет участников, просматривающих тему.
Модераторы: Alexey, boombastik, bazile, pl

Время GMT +3:00, Сейчас 4:44