OSDev

для всех
Текущее время: 27 апр 2024, 15:14

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 3 ] 
Автор Сообщение
СообщениеДобавлено: 26 июл 2012, 17:22 
Аватара пользователя

Зарегистрирован: 14 мар 2011, 12:31
Сообщения: 970
Откуда: Дагоба
Столкнулся со следующей неприятностью. Имеем некоторый массив байт. Причём, это не структура! Интерпретация одних полей зависит от содержимого других полей. В этом массиве встречаются слова (WORD), двойные слова (DWORD) и 64-битные значения (__int64). Мне их нужно ими манипулировать в общей мешанке. Для этого я оперирую виртуальными указателями, примерно так:
Код:
char  buf[256];
uint32_t  val;
val = *(uint32_t *)&buf[128];

С ключём -Wall и уровнем оптимизации >=2 получаю от GCC на это возмущённое замечание:
warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
Не нравится ему разыменовывать указатель на самом деле указующий на другие данные.
Я не хочу отказываться от -Wall или вводить специальный уровень aliasing rules для этого кода. Некрасиво это. Но вместе с тем, мне необходимо работать с этими данными. Я понимаю, что есть способ "в лоб":
Код:
val = buf[128] + ((uint32_t)buf[129]<<8) + ((uint32_t)buf[130]<<16) + ((uint32_t)buf[131]<<24)

Но он коряв сам по себе, транслируется в корявый код и вообще это всё через одно место автогеном. Но ведь подобные задачи на самом деле часто возникают и GCC должен как-то с ними справляться. Вопрос: как сделать простой и элегантный код, так чтобы и данные эффективно считывались/записывались и GCC был доволен?

_________________
Yet Other Developer of Architecture.
The mistery of Yoda’s speech uncovered is:
Just an old Forth programmer Yoda was.

<<< OS Boot Tools. >>>


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 26 июл 2012, 18:29 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
Так правильно для этого есть union.
Код:
union A
{
 int i;
 char c[2];
};


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 26 июл 2012, 18:48 
Аватара пользователя

Зарегистрирован: 14 мар 2011, 12:31
Сообщения: 970
Откуда: Дагоба
Конечно я знаю юнионы. Ну ты представляешь себе, как будет выглядеть полный комплект для работы с 16/32/64-битными значениями для чтения и для сохранения данных? Проще застрелиться.

Ладно, я уже сделал. Читаемость кода даже лучше стала. Правда, немножко в ущерб производительности, но там она совершенно некритична.

_________________
Yet Other Developer of Architecture.
The mistery of Yoda’s speech uncovered is:
Just an old Forth programmer Yoda was.

<<< OS Boot Tools. >>>


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB