OSDev http://osdev.su/ |
|
Преобразования данных - замечания GCC http://osdev.su/viewtopic.php?f=6&t=609 |
Страница 1 из 1 |
Автор: | Yoda [ 26 июл 2012, 17:22 ] |
Заголовок сообщения: | Преобразования данных - замечания GCC |
Столкнулся со следующей неприятностью. Имеем некоторый массив байт. Причём, это не структура! Интерпретация одних полей зависит от содержимого других полей. В этом массиве встречаются слова (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 был доволен? |
Автор: | pavia [ 26 июл 2012, 18:29 ] |
Заголовок сообщения: | Re: Преобразования данных - замечания GCC |
Так правильно для этого есть union. Код: union A
{ int i; char c[2]; }; |
Автор: | Yoda [ 26 июл 2012, 18:48 ] |
Заголовок сообщения: | Re: Преобразования данных - замечания GCC |
Конечно я знаю юнионы. Ну ты представляешь себе, как будет выглядеть полный комплект для работы с 16/32/64-битными значениями для чтения и для сохранения данных? Проще застрелиться. Ладно, я уже сделал. Читаемость кода даже лучше стала. Правда, немножко в ущерб производительности, но там она совершенно некритична. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |