![]() |
|
Модераторы: xvr |
![]()
|
|
| konshyn |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 295 Регистрация: 19.9.2013 Репутация: нет Всего: нет |
Собственно, сабж:
есть структура
Как это понять и почему возвращает на 4 байта больше, чем есть размер этой структуры? -------------------- «Потому что ценность акта действия в этой стране возрастает в несколько раз». |
||||
|
|||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 1 Всего: 211 |
||||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: нет Всего: 459 |
Думаю выравнивание структуры на границу 8 ми байт. #pragma pack в помощь для изменения границы выравнивания, правда это ухудшит производительность работы с памятью.
Этот ответ добавлен с нового Винграда - http://vingrad.com |
|||
|
||||
| konshyn |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 295 Регистрация: 19.9.2013 Репутация: нет Всего: нет |
Вот до сегодняшнего дня я бы так и сказал... Спасибо Буду знать Благо, всего одна переменная, поэтому не страшно Это сообщение отредактировал(а) konshyn - 22.10.2013, 10:14 -------------------- «Потому что ценность акта действия в этой стране возрастает в несколько раз». |
||||
|
|||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 1 Всего: 211 |
А что, размер так актуален? На самом деле потеря производительности не самое страшное, на что может повлиять изменение в выравнивании. Некоторые операционные системы просто не работают с невыравненными данными. |
|||
|
||||
| konshyn |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 295 Регистрация: 19.9.2013 Репутация: нет Всего: нет |
Это, конечно, плохо. Но пока что сделаю так. в убунту работает Ну, это неудобно писать - сумму всех полей или просто константное число. Хотя, Вы правы. Можно просто создать функцию, которая посчитает размер структуры и вернет ее значение. Та же сумма полей Ладно, зато узнал что-то новое -------------------- «Потому что ценность акта действия в этой стране возрастает в несколько раз». |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 1 Всего: 211 |
||||
|
||||
| konshyn |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 295 Регистрация: 19.9.2013 Репутация: нет Всего: нет |
Вообще, что мне нужно: я создаю пакет вручную. В начало пакета мне нужно добавить вот эту структуру - т.е. чтобы первые восемь байт моего пакета имели эти данные. Использую я memcpy():
Добавлено через 1 минуту и 51 секунду Но если идет выравнивание по байтам, то получается некоторые байты у меня будут равны нулю. Если так подумать, то это уж не очень страшно - плюс 4 байта. Но как-то не хочется -------------------- «Потому что ценность акта действия в этой стране возрастает в несколько раз». |
||||
|
|||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 1 Всего: 101 |
можно битовые поля использовать
|
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 1 Всего: 211 |
konshyn,
Если делать переносимо, ты нельзя посылать саму структуру, так-как на сервере могут быть другие правила выравнивания. Нет бинарной стандартизации в C++ к сожалению. Используйте структуру и при отправке через сеть делайте бинарную сериализацию, упаковывайте нужные данные в байт-массив и отправляйте. А на сервере идет бинарная десериализация. |
|||
|
||||
| konshyn |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 295 Регистрация: 19.9.2013 Репутация: нет Всего: нет |
Я так и делаю. Просто во время формирования пакета, проще сформировать структуру, а потом по байтово ее записать в байт-массив через memcpy, чем отдело все копировать. Нельзя. Попробовал, все равно выравнивание происходит. -------------------- «Потому что ценность акта действия в этой стране возрастает в несколько раз». |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 1 Всего: 211 |
Так я о том, что надо по отдельности все копировать, чтобы было переносимо. О размерах и размещении структуры ничего неизвестно. Размер структуры и расположение элементов зависит от платформы, системы, компилятора, ключей компиляции и погоды в Гаване |
|||
|
||||
| Фантом |
|
|||
![]() Вы это прекратите! ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1516 Регистрация: 23.3.2008 Репутация: 1 Всего: 49 |
Нельзя. Внутреннее представление структуры - дело компилятора, оно никак не регламентируется, соответственно, Вы не можете быть уверены даже в том, что все поля одной структуры расположены в памяти последовательно. |
|||
|
||||
| konshyn |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 295 Регистрация: 19.9.2013 Репутация: нет Всего: нет |
Это просто издевательство. Спасибо за разъяснения. Пойду, успокоюсь.. и буду переделывать -------------------- «Потому что ценность акта действия в этой стране возрастает в несколько раз». |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 1 Всего: 211 |
посмотрите в сторону boost serialization
|
|||
|
||||
| konshyn |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 295 Регистрация: 19.9.2013 Репутация: нет Всего: нет |
Сейчас гляну. Спасибо А есть еще boost:asio Может знаете, можно ли с его помощтью создавать пакетные сокеты, а то я не нашел -------------------- «Потому что ценность акта действия в этой стране возрастает в несколько раз». |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: нет Всего: 459 |
Да ну, не может быть. Есть же например, правило вызова конструкторов для полей-членов в конструкторе класса носителя, не зря же его привязывают к последовательности определения полей. Сами типы данных могут отличаться. Например в системе с обратным порядком байт, 32х битный int будет иметь иное представление в памяти, но очередность должна соблюдаться, также как, например очередность определения виртуальных функций. Она задает очередность записей в таблице VMT.
Этот ответ добавлен с нового Винграда - http://vingrad.com |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 1 Всего: 211 |
Порядок полей остается, но гарантии на расположение нет
|
|||
|
||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 1 Всего: 45 |
Честно говоря, так и просится оптимизация структуры
Но если структура уже кем-то задана, то сериализация/десериализация - самое оно. Можно попробовать работать с одной переменной __u64 вместо структуры, но это не путь C++ джедая))) -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
| Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: нет Всего: 39 |
Можно узнать какие ???? -------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: нет Всего: 459 |
Тут скорее не операционки, а процы в определенных режимах. ARM выдает аппаратную ошибку Datatype Misalignment если вдруг указатель на int имеет нечетный адрес. Вообще, программист вполне может располагать int и по не выровненному адресу, но компилятор должен об этом знать, и при обращении извлекать/записывать данные побайтово вместо того чтобы записать/прочитать в регистр разом. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| konshyn |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 295 Регистрация: 19.9.2013 Репутация: нет Всего: нет |
Можно, но так структура отражает суть, для чего она и где что значит. -------------------- «Потому что ценность акта действия в этой стране возрастает в несколько раз». |
|||
|
||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 1 Всего: 45 |
В данном случае выравнивание важнее отражаемой сути. Да и что так, что этак, суть никуда не делась... -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
| konshyn |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 295 Регистрация: 19.9.2013 Репутация: нет Всего: нет |
я тоже так подумал и изменил структуру(добавил поля) и порядок следования полей. Это сообщение отредактировал(а) konshyn - 28.11.2013, 12:18 -------------------- «Потому что ценность акта действия в этой стране возрастает в несколько раз». |
|||
|
||||
![]()
|
| Правила форума "С/С++: Программирование под Unix/Linux" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |