![]() |
|
Модераторы: 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
|
|||
|
||||
![]()
|
| Правила форума "С/С++: Программирование под 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. |