LINUX.ORG.RU

размер структуры

 


0

2
struct f
{
  unsigned long long a;
  unsigned short b;
  unsigned short c;
  unsigned char d;
  unsigned char e;
};

эта структура занимает 16 байт, а мне бы хотелось получить 14 байт. Я могу это как нибудь сделать?

Ответ на: комментарий от Deleted

ну да, мне же нужно на нужную позицию перейти накладывая указатель на буфер, и чтобы правильно пойти за эту структуру, нужно правильно 14 пройти.

u0atgKIRznY5
() автор топика

Обычно упакованных структур стараются избегать, и работают с через readv/writev или memcpy

anonymous
()
Ответ на: комментарий от anonymous

он заблокировал анонимусов, а книжки он не читает

Silerus ★★★★
()
Ответ на: комментарий от anonymous

Обычно упакованных структур стараются избегать, и работают с через readv/writev или memcpy

А что быстрее, 5 раз вызвать memcpy или 5 раз обратиться к полю структуры? А что удобней?

anonymous
()

Ты же вроде любитель быстрого? упакованные структуры очень медленные. Если ты забываешь про выравнивание, то измени свою структуру на

struct f
{
  unsigned long long a;
  unsigned short b;
  unsigned short c;
  unsigned char d;
  unsigned char e;
  char future_use[2];
};

Она также будет занимать 16 байт

Так же в gcc есть полезное предупреждение

-Wpadded

fsb4000 ★★★★★
()
Ответ на: комментарий от fsb4000

Она также будет занимать 16 байт

Ну да, конечно, везде и всюду... Во-первых, для этого придуманы типы uint8_t uint32_t и т. д. Во-вторых, машины отличаются порядками байт в словах. В-третьих, никакого универсального стандарта упаковки нет и совершено понятно почему.

Посмотрите как сделан код, работающий с сетью. Читаем буфер, копируем в элементы структуры, переприравниваем в текущий endian.

vodz ★★★★★
()
Ответ на: комментарий от u0atgKIRznY5

Зачем привязывать структуру к размеру? Возьми sizeof структуры и перемещайся ориентируясь на это количество байт. Все packed структуры работают медленее чем обычные. Специально руками ужимать структуры нужно лишь когда критически важна память которую они занимают. Кроме того, ты что эти 14 байт константой в коде задаешь? А если у тебя поле в структуре добавиться? А если под другую архитектуру/другим компилятором соберешь, где поля структуры у тебя будут другого размера?

Aswed ★★★★★
()
Ответ на: комментарий от Aswed

Возьми sizeof структуры и перемещайся ориентируясь на это количество байт.

Ну так для этого и нужно, чтобы переместиться на нужную позицию, используя правильный размер всех данных в структуре. pf = ( struct *f ) ( a + sizeof ( struct f ) );

Неужели не понятно из моих предыдущих сообщений? А так как данные занимают 14 байт, то нужно через 14 байт перейти, без packed структура 16 байт занимает, указатель неправильно будет установлен.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от Aswed

Зная фиксированный размер данных, можно и не паковать структуры, а использовать числа заранее известные.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от Aswed

Все packed структуры работают медленее чем обычные

Не вижу в теме «нужно 14 байт и чтоб быстро». На скорость то ТС не жаловался. Быстро не надо, подозреваю он что-то из сети подсасывает или из файла, и хочет получать доступ к полям таким образом.

И тема помечена как решенная, собственно это «пакед» ему помогло.

I-Love-Microsoft ★★★★★
()
Последнее исправление: I-Love-Microsoft (всего исправлений: 1)
Ответ на: комментарий от I-Love-Microsoft

Не шаришь, просвещайся

u0atgKIRznY5 ☆ (29.11.2017 15:21:47) ipcalc — определить начальный и конечный диапазон адресов (комментарий) я любитель быстрого, а ты любитель медленного

Педалирую последние месяцы этот мем, забавно, между прочим!

BruteForce ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.