bad*_*adp 5 c serialization struct
我正在用C编写一个FUSE插件.我通过以下结构跟踪文件系统中的数据结构:
typedef struct {
block_number_t inode;
filename_t filename; //char[SOME_SIZE]
some_other_field_t other_field;
} fs_directory_table_item_t;
Run Code Online (Sandbox Code Playgroud)
显然,我必须在某些时候从(到)磁盘读取(写入)这些结构.我可以将结构视为一个字节序列,并执行以下操作:
read(disk_fd, directory_table_item, sizeof(fs_directory_table_item_t));
Run Code Online (Sandbox Code Playgroud)
...除了不可能工作,因为filename实际上是指向char数组的指针.
我真的想避免编写如下代码:
read(disk_df, *directory_table_item.inode, sizeof(block_number_t));
read(disk_df, directory_table_item.filename, sizeof(filename_t));
read(disk_df, *directory_table_item.other_field, sizeof(some_other_field_t));
Run Code Online (Sandbox Code Playgroud)
...代码中的每个结构,因为我必须在不少于三个不同的地方(定义,阅读,写作)复制代码和更改.
任何DRYer但仍然可维护的想法?
字符串的内存将是结构的一部分,即使在很多情况下数组类型被提升为指针,结构中存储的类型是数组,而不是指针.
typedef struct {
block_number_t inode;
filename_t filename; //char[SOME_SIZE]
some_other_field_t other_field;
} fs_directory_table_item_t;
Run Code Online (Sandbox Code Playgroud)
所以你的阅读声明:
read(disk_fd, directory_table_item, sizeof(fs_directory_table_item_t));
Run Code Online (Sandbox Code Playgroud)
将工作并引入数据.
读取和写入内存块时,应考虑填充.填充是额外的,由编译器添加的空字段,用于对齐相关边界上的数据; 例如,32字节值通常应该从存储器中的4字节边界开始,以允许处理器有效地读取它.这通常无需担心,但是当将结构体持久化到磁盘时,如果使用其他设置重新编译代码,则可能会出现问题.通常会有一些#pragma禁用填充的指令,我认为它是#pragma pack在MS Visual c ++中命名的.