Re[8]: расмоложение мемберов класса в памяти
От: Кодт Россия  
Дата: 15.06.10 17:11
Оценка:
Здравствуйте, szag, Вы писали:

S>1. слишком много изменений в клиентском коде;

S>2. клиентский код станет писать сложнее, появится много зависимостей, как то, за был прописать поле в табличку или еще чего.

S>макросы эти были придуманы для того, чтобы сделать жизнь енд юзера проще, хорошо или плохо это было сделано вопрос другой, но сейчас клиентский код менять никто не даст, к тому же, он работает уже более 3-х лет, т.е. отлажен... и работает в разных организациях, которые не обрадуются такому апдейту сервера, при котором надо переписывать код...


Почему изменения в клиентском коде? Я спрашивал
1) макрос разворачивается в подобный код?
2) что мешает изменить макрос, чтобы он генерировал таблицу не только с размерами, но и смещениями?

Или же клиентский код уже скомпилирован, и его нельзя трогать?
То есть, — всё, что у нас есть, это таблица с отдельными полями. И по этой таблице надо восстановить лэяут структуры.

Тогда нужно для каждого поля знать не только его размер, но и его выравнивание. Это, по счастью, — свойство типа, а не свойство отдельного члена.
Логика более-менее простая:
int roundUp(int size, int align) { return (size+align-1)%align; }

int overall_tail = sizeof(Base); // текущий хвост структуры
int overall_align = _alignof(Base); // выравнивание структуры
int overall_size = min(1, roundUp(overall_tail, overall_align); // размер структуры

.....
// для каждого очередного поля

int field_size, field_align; // размер и выравнивание текущего поля
assert(field_align > 0);
assert(field_size % field_align == 0);

int field_offset = roundUp(overall_tail, field_align);

overall_align = max(overall_align, field_align);
overall_tail = field_offset + field_size;
overall_size = roundUp(overall_tail, overall_align);

Всё, что надо — это добавить в интерфейс рядом с GetSize() ещё и GetAlign().

Но, всё же, с таблицей смещений будет проще и надёжнее.
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.