Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

директива для gcc

37K
23 ноября 2011 года
qbikk
40 / / 08.09.2010
вообщем такой вопрос :
создается структура какая-то, предположим
 
Код:
typedef struct{...}HEAD
и потом из сокета считывается кол-во байт равное sizeof(HEAD)...вообщем на деле sizeof выдавал размер больший чем пофакту... мне сказали что это из-за того что компилятор делает оптимизацию какую-то и между элементами этой структуры могут появляться дырки... ну и сказали что надо компилятору задавать параметр что бы он все оставлял как есть... вообщем вопрос таков: какой параметр надо задать и можно ли это сделать спомощью директивы в autoconf.ac или automake.am? заранее спасибо
11
23 ноября 2011 года
oxotnik333
2.9K / / 03.08.2007
Это называется выравнивание. По дефолту вроде по границе 4-х байт.
#pragma pack(1) перед отправкой поставь.
240
24 ноября 2011 года
aks
2.5K / / 14.07.2006
И еще, если ты так данные по сети прям структурами - надо быть крайне осторожными. Потому как кроме это проблемы с выравниванием со временем легко проявляться проблемы с разной размерностью типов данных и порядком байт в них на разных аппаратных платформах или даже ОС.
37K
24 ноября 2011 года
qbikk
40 / / 08.09.2010
ну на передающей стороне, отправляется не структурой а каждое поле по отдельности, это я принять хочу структурой сразу... а как делать проверку в каком порядке следование байт? это на каком этапе надо делать проверку? при выполнение ./configure оон в config.h что ли продефайнит что-нить? и потом при отправке проверять это значение и если что то менять следование..? почитал в гугле, говорят что лучше в буфер все скидывать что хочешь передать и потом уже буфер передавать... это будет решать проблемму? а с размерность типов уже лажонулся как-то, дома все работало, пришел на работу а там все не так... мусор какой-то... терь с помощью ./configure определяю размеры типов и использую уже нужные... а насчет порядка, имеется в виду что на разных системах в структурах может быть по разному упорядочены данные?
и нсчет #pragma pack(push, 1 ) #pragma pack(pop) на сколько я вычитал в юнихе gcc не разрешает такой синтаксис(имеется ввиду push pop)...
240
24 ноября 2011 года
aks
2.5K / / 14.07.2006
Про порядок байт - речь о том что на разных хостах байты внутри числового типа могут быть расположены по разному. Проверять это не надо - надо зафиксировать в протоколе в каком порядке данные идут по сети. Например договориться что в сеть данные уходят всегда в сетевом порядке (он же big-endian). А при отрпавке/приеме переводить порядок, если нужно. Даже выдумывать ничего особо не надо - достаточно воспользоваться cредствами типа htonl/ntohl, htons/ntohs.

Цитата: qbikk
почитал в гугле, говорят что лучше в буфер все скидывать что хочешь передать и потом уже буфер передавать... это будет решать проблему?


Смотря в каком контексте это советуют. ВОзможно советуют поотдельности сереализовать/десериализовать туда в нужном формате все поля структуры. А потом уже буфером отправлять/принимать. Чтобы избежать всех проблем со структурами. Или может быть речь шла о буферизации, чтобы ускорить работу с передачей данных и отправлять их уже готовыми большими порциями.

37K
24 ноября 2011 года
qbikk
40 / / 08.09.2010
вообщем я так понял что считывать сразу структурой это не самая умная мысль)) считаю в буфер, а там буду в структуру данные рассовывать...
тогда еще вопросик появился: как правильно задавать размер буфера? ну т.е. можно просто число поставить, но это вроде не правильно, так как сложно сопровождать и править проект... sizeof(Head) тоже бессмыслено так как опять же выравнивание, а еслси использовать pack то какой смысл в буфере... можно продефайнить мол #define SIZE_OF_STRUCT_HEAD... интересно как делают грамотные люди)
11
24 ноября 2011 года
oxotnik333
2.9K / / 03.08.2007
В Qt есть замечательный класс для серелизации отправляемых/принимаемых данных. QDataStream называется. Можно в его исходниках поковыряться.
240
24 ноября 2011 года
aks
2.5K / / 14.07.2006
Зависит от структуры кода естественно. Вобще дефайны использовать для констант не желательно - можно статическую константу завести размером и там хранить размер пакета. Если есть где эту константу хранить. Язык кстати какой? С или C++?
В конце концов структура и размер вашего пакета специфицируется протоколом и по идее не зависит от языка программирования. Так что привязывать его к размеру структуры смысла нет.
37K
24 ноября 2011 года
qbikk
40 / / 08.09.2010
язык Си... платформа семейство unix/linux... ну вообщем понятно, буду править сейчас)) спасибо большое за помощь, получил много полезной информации)
41K
24 ноября 2011 года
kisssko
108 / / 28.10.2010
Цитата: oxotnik333
Это называется выравнивание. По дефолту вроде по границе 4-х байт.
#pragma pack(1) перед отправкой поставь.



Какая прагма? Это ж gcc. Тут, вроде как, __attribute__ используется.

11
24 ноября 2011 года
oxotnik333
2.9K / / 03.08.2007
Цитата: kisssko
Какая прагма? Это ж gcc. Тут, вроде как, __attribute__ используется.


Ну как бэ вот: http://gcc.gnu.org/onlinedocs/gcc/Structure_002dPacking-Pragmas.html

240
24 ноября 2011 года
aks
2.5K / / 14.07.2006
kisssko, и прагма используется и атрибуты. Для разных целей как правило. #pragma pack - используется.
Притом прагма - стандартное средство передачи компилятору специфичных для него параметров, закрепленное в стандарте. А __attribute__ - расширение gcc.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог