|
|
|
Supreme Being
      
участник
Last Login: 30.09.2008 17:18
Сообщ.: 121,
Visits: 2 334
|
|
Здравствуйте. Помогите, пожалуйста, у меня уже голова кругом. В приложении кусок кода. Компилятор 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);
|
|
|
|
|
Forum Guru
      
участник
Last Login: 15.10.2008 20:53
Сообщ.: 60,
Visits: 642
|
|
Ну так а в чем проблема? Как раз эта структура и кратна 16 байтам и без прагмы
struct SSE_128AlignedData
{
float Data[9];
float Unused[7];
};
std::cout << sizeof(SSE_128AlignedData) / 16 << std::endl;
Выведет 4
Ты напиши, что тебе нужно сделать, а то не совсем понятно
|
|
|
|
|
Supreme Being
      
участник
Last Login: 30.09.2008 17:18
Сообщ.: 121,
Visits: 2 334
|
|
| Проблема не в этом. Размер структуры мне не так важен. Надо чтобы структура располагалась в памяти по адресу, кратному 16 байтам. Поэтому я делаю проверку (DWORD)&Koef % 16 == 0, т.е. остаток от деления адреса структуры на 16 должен равняться нулю.
|
|
|
|
|
Supreme Being
      
модератор
Last Login: 10.11.2008 0:08
Сообщ.: 1 298,
Visits: 12 501
|
|
|
|
|
|
Supreme Being
      
модератор
Last Login: 10.11.2008 0:08
Сообщ.: 1 298,
Visits: 12 501
|
|
Похоже, что в 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) не рекомендуется.
|
|
|
|
|
Supreme Being
      
участник
Last Login: 30.09.2008 17:18
Сообщ.: 121,
Visits: 2 334
|
|
| Да, спасибо, насчет #pragma pack мне уже подсказали. Остается способ выделять память GlobalAlloc, чуть большую, чем нужно, потом сдвигаться до адреса, кратного 16. Но этот вариант меня не совсем устраивает по ряду причин. Очень жаль, что нет такой простой директивы препроцессора.
|
|
|
|