Собственные определения uint_fast8_t и компании
От: enji  
Дата: 30.08.13 22:00
Оценка:
Вкратце
Как сделать так, чтобы при компиляции мингв размер (u)int_fast8_t был 1 байт, а (u)int_fast16_t — 2 байта?

Подробно
У меня есть программа для 8-битного проца. А в ней — сериализация объектов в епром
template<class T>
void serialize(Stream *s, T&v) {
  s.serialize(&v, sizeof(v));
}

struct A{
  uint_fast8_t a;
#if A_HAS_B
  uint_fast16_t b;
#endif
  uint_fast32_t notSerialize;
  void serialize(Stream *s) {
    serialize(s, a);
#if A_HAS_B
    serialize(s, b);
#endif
  }
} a[100];
struct B { ... } b[20];
struct C { ... } c[30];

MEMORY_MAP(
  /// кол-во
  ///      размер сериализуемой части элемента
  (a, 100, 3)
  (b, 20,  5)
  (c, 30,  1)
);


MEMORY_MAP по количеству объектов и размеру данных для сериализации вычисляет адреса в епроме.

Проблема в том, что размер этой части элемента зависит от директив компиляции и может отличаться в разы. Если брать максимальные размеры, то я не помещаюсь в епром. Кроме того, надо не забывать менять размеры при изменении элементов — в общем геморрой. Сделать вычисление размера динамически не охота — на кэш не хватает ОЗУ, а считать каждый раз при сохранении — долго.

Появилась мысль скомпилировать это скажем мингв, подставить новую функцию main, посчитать в ней размеры сериализуемых частей объектов (подсунув специальный поток для сериализации) и сгенерить карту епрома. А потом эту карту уже компилировать кросс-компилятором.

Однако я использую xxx_fastY_t типы, а на мингв они будут иметь другой размер. Т.е. мне нужно что-то вроде typedef unsigned char uint_fast8_t, однако такое противоречит объявлениям в stdint.h.
Пока приходит в голову только глобальный find/replace uint_fast8_t на какой-нить uint_f8_t.

Нет ли способа получше?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.