Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, szag, Вы писали:
[skipped]
К>Но, всё же, с таблицей смещений будет проще и надёжнее.
Я бы иначе написал это и думаю угодил бы запросу szag.
Собственно сообразить как компилятор и что размещает не сложно зная типы полей
Примерно так, -для простоты у меня шаблон, а у szag можно сделать табличку для замены sizeof(std::remove_all_extents<T>::type):
template <class T> int next_offset(int &offset, int &total_size) {
int x = offset;
size_t size = sizeof(T), mask = sizeof(std::remove_all_extents<T>::type) - 1,
trusted_offset = offset;
if (offset & mask) {
trusted_offset = offset = (offset + mask) & ~mask;
}
offset += size; total_size += offset - x;
return trusted_offset;
}
финальный размер тоже подровнять
total_size = (total_size + (compiler_opt_align -1)) &~(compiler_opt_align -1)
естественно в начале
int offset=0, total_size =0
p.s.. проверено на POD's включая поля растущие как typedef pod_type type_name[N]