Re: очень хитрый вопрос
От: Vitek  
Дата: 20.05.01 13:20
Оценка:
Здравствуйте Молочный Леонид Николаевич, вы писали:

МЛН>Есть такое дело ,объвляю структуру (одни данные )и к примеру мне нужно

МЛН>заполнить её нулями вроде бы стандартная задача(использую memset),но делая
МЛН>sizeof получаю размер на 4 байта больше это я потом вспомнил ,что это this
МЛН>указатель, но просто из-за sizeof он у меня часто используется проблемы
МЛН>возникают ,что мне делать подскажите ,как получить правильный размер ,так
МЛН>как если это с то всё пучком если C++ проблемы.
МЛН>и такое дело объявляю
МЛН>struct {
МЛН>unsigned char ver:4;
МЛН>unsigned char len:4;
МЛН>}
МЛН>в памяти оно меняет октеты местами ,мне это не нужно ,хотя на самом деле это
МЛН>было бы прваильно если это был бы один байт ,что мне делать ?

На C++Builder...
Октеты действительно меняет...
Но размер — 1 байт. И всё вроде даже логично.
Кстати о каком this идёт речь. Что это такое? (в данном контексте)

Вроде не класс. Обычная структура.
Почему ж тогда на Си++ проблемы (повторяю — у меня всё нормально)

Если проблемы с размером не связаны с описанной структурой, то...
Компиляторы имеют свойство... эээ... забыл как это по-русски...
Alignment что-ли.
Короче выравнивание происходит по размеру int'а (т.е. в Win32 на 4 байта).
Причём каждого параметра структуры (если их нельзя объединить).

struct st {
char v1;
char v2;
int v3;
};
Енто будет 8 байт (а не 6)
Первые 4 — char v1 и v2
Последние — int v3

struct st {
char v1;
int v3;
char v2;
};
А вот енто... ни за что не угадаешь — будет 12 байт (и не 6, и не 8)
Первые 4 — char v1
Вторые — int v3
Последние — char v2

Ээээ... такие фокусы нам ещё Коперфильд в институте на физике показывал

st a;
... = &a; // адрес структуры
... = &(a.v3); // адрес переменной v3
... = ((char*)&(s.v3)) — ((char*)&s); // смещение переменной v3 в структуре

--
Шутки шутками, но... если что надо спрашивай
Victor Dunaev (vitek@fromru.com)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.