Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.61/28: Рейтинг темы: голосов - 28, средняя оценка - 4.61
John Paramol
#1

Помогите разобраться с выравниванием данных

10.05.2007, 00:44. Просмотров 5102. Ответов 5
Метки нет (Все метки)

Здравствуйте.
Помогите, пожалуйста, у меня уже голова кругом. В приложении кусок кода. Компилятор C++ Bulder 6. Пытаюсь выровнять данные по границе 16 байт. По всем признакам, это делается директивой #pragma pack(16), однако данные не хотят выравниваться. Я уже добавил лишние float Unused[7] для дополнения структуры до размера, кратного 16 байтам, но все равно не помогает.
Может, кто-нибудь сталкивался с подобным? Хотя бы что можно еще попробовать?
Может быть, можно выделить память с помощью GlobalAlloc с выравниванием?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
  #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);
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.05.2007, 00:44
Ответы с готовыми решениями:

Помогите разобраться с библиотеками
#include <vcl.h> #include <math.h> #pragma hdrstop #include "Main.h"...

Помогите разобраться с шаблонами
Пытаюсь реализовать новую для себя методику "службы класса". Все хорошо...

Помогите разобраться в C++ Builder XE
Помогите разобраться в C++ Builder XE !! Вчера установил себе новый С++ до...

Помогите разобраться новичку!!
Всем здрасте!) Мы только начали изучать среду Borland C++ Builder, поэтому...

Помогите разобраться в коде
Здрасьте!!! помогиде разобраться в одном коде!!!! void __fastcall...

5
Logot
1 / 1 / 1
Регистрация: 15.05.2010
Сообщений: 54
10.05.2007, 03:58 #2
Ну так а в чем проблема? Как раз эта структура и кратна 16 байтам и без прагмы
C++
1
2
3
4
5
6
struct SSE_128AlignedData
{
  float Data[9];
  float Unused[7];
};
std::cout << sizeof(SSE_128AlignedData) / 16 << std::endl;
Выведет 4

Ты напиши, что тебе нужно сделать, а то не совсем понятно
0
John Paramol
10.05.2007, 04:48 #3
Проблема не в этом. Размер структуры мне не так важен. Надо чтобы структура располагалась в памяти по адресу, кратному 16 байтам.
Поэтому я делаю проверку (DWORD)&Koef % 16 == 0, т.е. остаток от деления адреса структуры на 16 должен равняться нулю.
boombastik
7 / 7 / 11
Регистрация: 13.02.2007
Сообщений: 1,255
11.05.2007, 16:14 #4
Вот тут есть пример работы #pragma pack(1):

http://publib.boulder.ibm.com/infoce...f/rnpgpack.htm



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



С уважением,

Владимир
0
boombastik
7 / 7 / 11
Регистрация: 13.02.2007
Сообщений: 1,255
11.05.2007, 16:25 #5
Похоже, что в Borland Builder #pragma pack работает похожим образом:

http://faqs.org.ru/progr/c_cpp/cbuilder.htm
>Q9: Почему в билдере размер структуры всегда растягивается до кратного 4-ем?
A: Из-за выравнивания (RTFM Data Alignment).

Чтобы поля структуры выравнивались на 8-ми битную границу, необходимо использовать следующую конструкцию:
C++
1
2
3
#pragma pack(push, 1)
<structure definition>
#pragma pack(pop)
Менять выравнивание для всего проекта (Project OptionsAdvanced Compiler Data Alignment) не рекомендуется.
0
John Paramol
12.05.2007, 03:11 #6
Да, спасибо, насчет #pragma pack мне уже подсказали. Остается способ выделять память GlobalAlloc, чуть большую, чем нужно, потом сдвигаться до адреса, кратного 16. Но этот вариант меня не совсем устраивает по ряду причин. Очень жаль, что нет такой простой директивы препроцессора.
12.05.2007, 03:11
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.05.2007, 03:11

Чат ч-з Indy. Помогите разобраться!!!
Нашол пример чата в книге но переписав его для просмотра работы, повыскакивали...

Помогите разобраться (не создает папки)
Пытаюсь программно создать папки в системных папках (например System32) на...

Помогите разобраться с конструктором формы
В заголовке файла Unit.cpp в блоке private: я добавляю массив: class TForm1...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru