﻿<?xml version='1.0' encoding='UTF-8'?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>Релиб / Программирование / C++  / Помогите разобраться с выравниванием данных / Latest Posts</title><generator>InstantForum.NET v4.1.4</generator><description>Релиб</description><link>http://www.relib.com/forums/</link><webMaster>robot@relib.com</webMaster><lastBuildDate>Thu, 08 Jan 2009 06:58:39 GMT</lastBuildDate><ttl>20</ttl><item><title>RE: Помогите разобраться с выравниванием данных</title><link>http://www.relib.com/forums/Topic913136-7-1.aspx</link><description>Да, спасибо, насчет #pragma pack мне уже подсказали. Остается способ выделять память GlobalAlloc, чуть большую, чем нужно, потом сдвигаться до адреса, кратного 16. Но этот вариант меня не совсем устраивает по ряду причин. Очень жаль, что нет такой простой директивы препроцессора.</description><pubDate>Fri, 11 May 2007 23:11:43 GMT</pubDate><dc:creator>John Paramol</dc:creator></item><item><title>RE: Помогите разобраться с выравниванием данных</title><link>http://www.relib.com/forums/Topic913136-7-1.aspx</link><description>Похоже, что в Borland Builder #pragma pack работает похожим образом:&lt;br&gt;&lt;br&gt;[url]http://faqs.org.ru/progr/c_cpp/cbuilder.htm[/url]&lt;br&gt;&lt;br&gt;[quote]&lt;br&gt;&gt;Q9: Почему в билдере размер структуры всегда растягивается до кратного&lt;br&gt;&gt;    4-ем?&lt;br&gt;&lt;br&gt;A: Из-за выравнивания (RTFM Data Alignment).&lt;br&gt;   Чтобы поля структуры выравнивались на 8-ми битную границу, необходимо&lt;br&gt;   использовать следующую конструкцию:&lt;br&gt;&lt;br&gt;   #pragma pack(push, 1)&lt;br&gt;   &lt;structure definition&gt;&lt;br&gt;   #pragma pack(pop)&lt;br&gt;&lt;br&gt;   Менять выравнивание для всего проекта (Project Options\Advanced Compiler\&lt;br&gt;   Data Alignment) не рекомендуется.&lt;br&gt;[/quote]</description><pubDate>Fri, 11 May 2007 12:25:12 GMT</pubDate><dc:creator>boombastik</dc:creator></item><item><title>RE: Помогите разобраться с выравниванием данных</title><link>http://www.relib.com/forums/Topic913136-7-1.aspx</link><description>Вот тут есть пример работы #pragma pack(1):&lt;br&gt;[url]http://publib.boulder.ibm.com/infocenter/macxhelp/v6v81/topic/com.ibm.vacpp6m.doc/compiler/ref/rnpgpack.htm[/url]&lt;br&gt;&lt;br&gt;по-моему там выравнивание не адреса по которому распологаются объекты структуры, а выравниваение адресов по которому располагаются элементы структуры относительно друг друга&lt;br&gt;&lt;br&gt;С уважением,&lt;br&gt;Владимир</description><pubDate>Fri, 11 May 2007 12:14:23 GMT</pubDate><dc:creator>boombastik</dc:creator></item><item><title>RE: Помогите разобраться с выравниванием данных</title><link>http://www.relib.com/forums/Topic913136-7-1.aspx</link><description>Проблема не в этом. Размер структуры мне не так важен. Надо чтобы структура располагалась в памяти по адресу, кратному 16 байтам.&lt;/P&gt;&lt;P&gt;Поэтому я делаю проверку (DWORD)&amp;amp;Koef % 16 == 0, т.е. остаток от деления адреса структуры на 16 должен равняться нулю.</description><pubDate>Thu, 10 May 2007 00:48:34 GMT</pubDate><dc:creator>John Paramol</dc:creator></item><item><title>RE: Помогите разобраться с выравниванием данных</title><link>http://www.relib.com/forums/Topic913136-7-1.aspx</link><description>Ну так а в чем проблема? Как раз эта структура и кратна 16 байтам и без прагмы&lt;br&gt;struct SSE_128AlignedData&lt;br&gt;{&lt;br&gt;  float Data[9];&lt;br&gt;  float Unused[7];&lt;br&gt;};&lt;br&gt;&lt;br&gt;std::cout &lt;&lt; sizeof(SSE_128AlignedData) / 16 &lt;&lt; std::endl;&lt;br&gt;&lt;br&gt;Выведет 4&lt;br&gt;&lt;br&gt;Ты напиши, что тебе нужно сделать, а то не совсем понятно</description><pubDate>Wed, 09 May 2007 23:58:14 GMT</pubDate><dc:creator>Logot</dc:creator></item><item><title>Помогите разобраться с выравниванием данных</title><link>http://www.relib.com/forums/Topic913136-7-1.aspx</link><description>Здравствуйте.&lt;BR&gt;Помогите, пожалуйста, у меня уже голова кругом. В приложении кусок кода. Компилятор C++ Bulder 6. Пытаюсь выровнять данные по границе 16 байт. По всем признакам, это делается директивой #pragma pack(16), однако данные не хотят выравниваться. Я уже добавил лишние float Unused[7] для дополнения структуры до размера, кратного 16 байтам, но все равно не помогает.&lt;BR&gt;Может, кто-нибудь сталкивался с подобным? Хотя бы что можно еще попробовать?&lt;BR&gt;Может быть, можно выделить память с помощью GlobalAlloc с выравниванием?&lt;P&gt;  [code]  #pragma pack(push,16)&lt;BR&gt;  struct SSE_128AlignedData&lt;BR&gt;  {&lt;BR&gt;    float Data[9];&lt;BR&gt;    float Unused[7];&lt;BR&gt;  };&lt;BR&gt;  static SSE_128AlignedData Koef;&lt;BR&gt;  static SSE_128AlignedData CR;&lt;BR&gt;  static SSE_128AlignedData CG;&lt;BR&gt;  static SSE_128AlignedData CB;&lt;BR&gt;  #pragma pack (pop)&lt;/P&gt;&lt;P&gt;  /*ShowMessage("Koef = 0x"+IntToHex((int)&amp;amp;Koef,8)+&lt;BR&gt;              "  CR = 0x"+IntToHex((int)&amp;amp;CR,8)+&lt;BR&gt;              "  CG = 0x"+IntToHex((int)&amp;amp;CG,8)+&lt;BR&gt;              "  CB = 0x"+IntToHex((int)&amp;amp;CB,8));*/&lt;/P&gt;&lt;P&gt;  if((DWORD)&amp;amp;Koef % 16 ||&lt;BR&gt;     (DWORD)&amp;amp;CR % 16 ||&lt;BR&gt;     (DWORD)&amp;amp;CG % 16 ||&lt;BR&gt;     (DWORD)&amp;amp;CB % 16) Beep(1000,100);[/code]</description><pubDate>Wed, 09 May 2007 20:44:46 GMT</pubDate><dc:creator>John Paramol</dc:creator></item></channel></rss>