Модераторы: xvr

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> sizeof возвращает большее значение, чем есть 
V
    Опции темы
konshyn
Дата 22.10.2013, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 19.9.2013

Репутация: нет
Всего: нет



Собственно, сабж:
есть структура
Код

struct add_to_packet {
    __u16    size_packet;
    __u8    numbers;
    __u32    id;
    __u8    num;

};


Код

struct add_to_packet atp;
unsigned int n1 = sizeof(atp.id); // 4 байта
unsigned int n2 = sizeof(atp.num);// 1 байт
unsigned int n3 = sizeof(atp.numbers);// 1 байт
unsigned int n4 = sizeof(atp.size_packet);// 2 байта
unsigned int n5 = sizeof(atp);// 12 байт
unsigned int n6 = sizeof(add_to_packet);// 12 байт
unsigned int n7 = sizeof(struct add_to_packet);// 12 байт


Как это понять и почему возвращает на 4 байта больше, чем есть размер этой структуры?


--------------------
«Потому что ценность акта действия в этой стране возрастает в несколько раз».
PM MAIL Skype   Вверх
azesmcar
Дата 22.10.2013, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 1
Всего: 211



PM   Вверх
Alexeis
Дата 22.10.2013, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: нет
Всего: 459



Думаю выравнивание структуры на границу 8 ми байт. #pragma pack в помощь для изменения границы выравнивания, правда это ухудшит производительность работы с памятью.

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM ICQ Skype   Вверх
konshyn
Дата 22.10.2013, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 19.9.2013

Репутация: нет
Всего: нет



Цитата(azesmcar @ 22.10.2013,  09:57)
http://habrahabr.ru/post/142662/

Цитата

Недавно познакомился со структурами C/C++ — struct. Господи, да «что же с ними знакомиться» скажете вы?

Вот до сегодняшнего дня я бы так и сказал...
Спасибо

Цитата(Alexeis @  22.10.2013,  09:57 Найти цитируемый пост)
правда это ухудшит производительность работы с памятью.

Буду знать
Благо, всего одна переменная, поэтому не страшно

Это сообщение отредактировал(а) konshyn - 22.10.2013, 10:14


--------------------
«Потому что ценность акта действия в этой стране возрастает в несколько раз».
PM MAIL Skype   Вверх
azesmcar
Дата 22.10.2013, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 1
Всего: 211



Цитата(konshyn @  22.10.2013,  10:10 Найти цитируемый пост)
Буду знать
Благо, всего одна переменная, поэтому не страшно

А что, размер так актуален?
На самом деле потеря производительности не самое страшное, на что может повлиять изменение в выравнивании.
Некоторые операционные системы просто не работают с невыравненными данными.
PM   Вверх
konshyn
  Дата 22.10.2013, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 19.9.2013

Репутация: нет
Всего: нет



Цитата(azesmcar @  22.10.2013,  10:26 Найти цитируемый пост)
Некоторые операционные системы просто не работают с невыравненными данными. 

Это, конечно, плохо. Но пока что сделаю так. в убунту работает

Цитата(azesmcar @  22.10.2013,  10:26 Найти цитируемый пост)
А что, размер так актуален?

Ну, это неудобно писать - сумму всех полей или просто константное число.
Хотя, Вы правы. Можно просто создать функцию, которая посчитает размер структуры и вернет ее значение. Та же сумма полей

Ладно, зато узнал что-то новое  smile 


--------------------
«Потому что ценность акта действия в этой стране возрастает в несколько раз».
PM MAIL Skype   Вверх
azesmcar
Дата 22.10.2013, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 1
Всего: 211



Цитата(konshyn @  22.10.2013,  10:34 Найти цитируемый пост)
Ну, это неудобно писать - сумму всех полей или просто константное число.

Т.е. вам нужен не размер структуры а сумма размеров всех полей? Это принципиально разные вещи smile

PM   Вверх
konshyn
Дата 22.10.2013, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 19.9.2013

Репутация: нет
Всего: нет



Цитата(azesmcar @  22.10.2013,  10:37 Найти цитируемый пост)
Т.е. вам нужен не размер структуры а сумма размеров всех полей?

Вообще, что мне нужно: я создаю пакет вручную. В начало пакета мне нужно добавить вот эту структуру - т.е. чтобы первые восемь байт моего пакета имели эти данные.
Использую я memcpy():
Код

memcpy((void*)buff, &atp, sizeof(struct add_to_packet));


Добавлено через 1 минуту и 51 секунду
Но если идет выравнивание по байтам, то получается некоторые байты у меня будут равны нулю. Если так подумать, то это уж не очень страшно - плюс 4 байта. Но как-то не хочется


--------------------
«Потому что ценность акта действия в этой стране возрастает в несколько раз».
PM MAIL Skype   Вверх
baldina
Дата 22.10.2013, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 1
Всего: 101



можно битовые поля использовать
Код

struct add_to_packet {
    __u16   size_packet : 16;
    __u8    numbers     :  8;
    __u32   id          : 32;
    __u8    num         :  8;
};

PM MAIL   Вверх
azesmcar
Дата 22.10.2013, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 1
Всего: 211



konshyn, 

Если делать переносимо, ты нельзя посылать саму структуру, так-как на сервере могут быть другие правила выравнивания. Нет бинарной стандартизации в C++ к сожалению.
Используйте структуру и при отправке через сеть делайте бинарную сериализацию, упаковывайте нужные данные в байт-массив и отправляйте. А на сервере идет бинарная десериализация.
PM   Вверх
konshyn
Дата 22.10.2013, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 19.9.2013

Репутация: нет
Всего: нет



Цитата(azesmcar @  22.10.2013,  11:11 Найти цитируемый пост)
упаковывайте нужные данные в байт-массив и отправляйте. 

Я так и делаю.
Просто во время формирования пакета, проще сформировать структуру, а потом по байтово ее записать в байт-массив через memcpy, чем отдело все копировать.


Цитата(baldina @  22.10.2013,  11:09 Найти цитируемый пост)
можно битовые поля использовать

Нельзя. Попробовал, все равно выравнивание происходит.



--------------------
«Потому что ценность акта действия в этой стране возрастает в несколько раз».
PM MAIL Skype   Вверх
azesmcar
Дата 22.10.2013, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 1
Всего: 211



Цитата(konshyn @  22.10.2013,  11:21 Найти цитируемый пост)
Просто во время формирования пакета, проще сформировать структуру, а потом по байтово ее записать в байт-массив через memcpy, чем отдело все копировать.

Так я о том, что надо по отдельности все копировать, чтобы было переносимо. О размерах и размещении структуры ничего неизвестно. Размер структуры и расположение элементов зависит от платформы, системы, компилятора, ключей компиляции и погоды в Гаване smile

PM   Вверх
Фантом
Дата 22.10.2013, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


Профиль
Группа: Участник Клуба
Сообщений: 1516
Регистрация: 23.3.2008

Репутация: 1
Всего: 49



Цитата(konshyn @  22.10.2013,  12:21 Найти цитируемый пост)

Просто во время формирования пакета, проще сформировать структуру, а потом по байтово ее записать в байт-массив через memcpy, чем отдело все копировать.

Нельзя. Внутреннее представление структуры - дело компилятора, оно никак не регламентируется, соответственно, Вы не можете быть уверены даже в том, что все поля одной структуры расположены в памяти последовательно.
PM   Вверх
konshyn
Дата 22.10.2013, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 19.9.2013

Репутация: нет
Всего: нет



Цитата(azesmcar @  22.10.2013,  11:46 Найти цитируемый пост)
Так я о том, что надо по отдельности все копировать, чтобы было переносимо. О размерах и размещении структуры ничего неизвестно. Размер структуры и расположение элементов зависит от платформы, системы, компилятора, ключей компиляции и погоды в Гаване smile


Цитата(Фантом @  22.10.2013,  11:53 Найти цитируемый пост)
Нельзя. Внутреннее представление структуры - дело компилятора, оно никак не регламентируется, соответственно, Вы не можете быть уверены даже в том, что все поля одной структуры расположены в памяти последовательно. 



Это просто издевательство.  smile 

Спасибо за разъяснения. Пойду, успокоюсь.. и буду переделывать smile


--------------------
«Потому что ценность акта действия в этой стране возрастает в несколько раз».
PM MAIL Skype   Вверх
azesmcar
Дата 22.10.2013, 12:04 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 1
Всего: 211



посмотрите в сторону boost serialization
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0573 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.