Я хотел бы знать, как лучше работать с структурами данных на диске, учитывая, что макет хранилища должен точно соответствовать логическому дизайну. Я считаю, что выравнивание и упаковка структуры не очень помогают, когда вам нужно иметь определенный макет для вашего хранилища.
Мой подход к этой задаче заключается в определении (ширины) структуры с использованием директивы процессора и использовании ширины массивов символов распределения (байтов), которые я буду записывать на диск после добавления данных, следующих за моделью логической структуры.
например:
typedef struct __attribute__((packed, aligned(1))) foo {
uint64_t some_stuff;
uint8_t flag;
} foo;
Если я сохраню foo on-disk, значение "flag" появится в самом конце данных. Учитывая, что я могу легко использовать foo при чтении данных с использованием fread по типу & foo, тогда используя структуру обычно без каких-либо дополнительных байтов.
Вместо этого я предпочитаю делать это
#define foo_width sizeof(uint64_t)+sizeof(uint8_t)
uint8_t *foo = calloc(1, foo_width);
foo[0] = flag_value;
memcpy(foo+1, encode_int64(some_value), sizeof(uint64_t));
Затем я просто использую fwrite и fread для фиксации и чтения байтов, но позже распакую их, чтобы использовать данные, хранящиеся в разных логических полях.
Интересно, какой подход лучше всего использовать, учитывая, что расположение хранилища на диске соответствует логическому расположению... это был всего лишь пример...
Если кто-нибудь знает, насколько эффективен каждый метод в отношении декодирования/распаковки байтов и копирования структуры непосредственно из него на диске, пожалуйста, поделитесь им, я лично предпочитаю использовать второй подход, так как он дает мне полный контроль над макетом хранения, но я я не готов жертвовать поиском производительности, поскольку для этого подхода требуется много логики цикла для распаковки/прохождения через байты к различным границам данных.
Спасибо.