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

К>Здравствуйте, 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]
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.