Здравствуйте, 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().
Но, всё же, с таблицей смещений будет проще и надёжнее.