Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: 1 [2]  Все   Вниз
  Печать  
Автор Тема: выравнивание структур  (Прочитано 36081 раз)
0 Пользователей и 1 Гость смотрят эту тему.
sss
Специалист

ru
Offline Offline

« Ответ #30 : 30-12-2009 10:20 » 

Блин, не могу остановиться - ведь суть вопроса, заданного  Алексей1153++, заключается:

Что быстрее будет выполняться - код работающий со структурами, обрамленными
#pragma pack (1) или pragma pack (4)? 

И я считаю, что разницы нет! Ведь выделять память будет менеджер памяти windows, гранулированную  и выровненную на 8 байт. Поэтому
 darkelf хватит уводить суть вопроса в сторону... А про шину адреса спорить я не собирался.
Записан

while (8==8)
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #31 : 30-12-2009 10:28 » 

ну то есть пак(1) лишь съэкономит память, не ударяя по скорости ?
Записан

sss
Специалист

ru
Offline Offline

« Ответ #32 : 30-12-2009 10:29 » 

да. Я должен показать как я попал с pack(1)..
Код:
#pragma pack (push)
#pragma pack (1)
struct NET_OP_OVERLAPPED
{
  char                        Res[1];
  OVERLAPPED                  Ovp;
  CNetOperation*              m_pOwner;
  NET_OP_OVERLAPPED( CNetOperation* pOwner) : m_pOwner(pOwner) {};
};
#pragma pack (pop)

Вот я подсунул адрес на член NET_OP_OVERLAPPED::Ovp, и пока не объявил  char  Res[4], GetQueuedCompletionStatus не исполнялась...
« Последнее редактирование: 30-12-2009 10:34 от sss » Записан

while (8==8)
darkelf
Молодой специалист

ua
Offline Offline

« Ответ #33 : 30-12-2009 10:38 » 

sss, а при чём тут менеджер памяти Windows? например, у нас есть структура:
Код:
struct my_struct
{ char a;
   int b;
};

если указан #pragma pack(4), то первое поле "a" будет иметь адрес 0, относительно структуры, а второе "b" - адрес 4, соответственно процессор будет работать быстрее, т.к. работа будет производиться по выравненным данным, а если поставить #pragma pack(1), то, то первое поле "a" будет иметь адрес 0, а второе "b" - 1, соответственно, будет осуществляться обращение к невыравненным данным, со всеми соответствующими проблемами.
Записан
sss
Специалист

ru
Offline Offline

« Ответ #34 : 30-12-2009 10:40 » 

darkelf, ты же сам говорил об 8 байтной грануле???
Записан

while (8==8)
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #35 : 30-12-2009 10:43 » 

короче, вы мне тут кончайте бабушку лохматить Отлично  Вскрытие покажет, что быстрее. Как раз праздники для тестов ))
Записан

sss
Специалист

ru
Offline Offline

« Ответ #36 : 30-12-2009 10:45 » 

Алексей1153++, darkelf прав однозначно... Вот пример ужаса
Код:
struct _s
{
  char  b;
  long  l[10];
};

Каждый второй в массиве l будет подвержен замесу с адресной шиной....

darkelf ссори.
« Последнее редактирование: 30-12-2009 10:48 от sss » Записан

while (8==8)
darkelf
Молодой специалист

ua
Offline Offline

« Ответ #37 : 30-12-2009 10:47 » 

sss, если не смотреть в 64-х битные процессоры, то, имхо, выравнивания на 4 будет достаточно, так-как в любом случае при выравнивании на 4 слово не будет пересекать 8-ми байтную грануляцию.
Записан
Страниц: 1 [2]  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines