大小端不同的设备之间,怎样设计可移植的序列化代码?
协议必须明确每个多字节字段的线序和长度,编码、解码时逐字段转换并做边界检查,不能 memcpy 整个结构体。浮点和位域还要明确表示格式,测试应包含固定黄金字节序列。
Question Bank
按知识、方向与难度筛选;每道题都有分层回答和工程追问。
协议必须明确每个多字节字段的线序和长度,编码、解码时逐字段转换并做边界检查,不能 memcpy 整个结构体。浮点和位域还要明确表示格式,测试应包含固定黄金字节序列。
经基类指针删除派生对象时,基类析构函数必须满足多态删除要求,通常声明 virtual;按值传递派生对象给基类会发生切片,派生状态和动态行为丢失。资源受限系统还应评估 vtable、间接调用和所有权。
不能只凭习惯决定。要评估工具链 ABI、代码体积、最坏路径、异常表、第三方库和故障策略;关闭异常后必须用 expected、状态码或构造后校验建立一致错误模型,关闭 RTTI 后也不能再依赖 dynamic_cast/typeid。
弱定义在没有强定义时提供默认实现,常用于启动文件中断别名和库 Hook。最终选择发生在链接阶段,必须用符号表和 map 文件确认;同名强符号、静态库提取规则和 LTO 都可能让覆盖结果偏离预期。
map 适合看链接输入、地址和内存占用;nm 看符号定义与绑定;objdump 可反汇编和查看段内容;readelf 直接解析 ELF 头、Section、Program Header、重定位与 DWARF。组合使用能确认符号来自哪里、最终放到哪里。
柔性数组只能作为结构体最后一个成员,本身不计入常规 sizeof,但结构尾部可能仍有填充。分配时要检查 header + count * element 是否溢出,并让对象总寿命覆盖所有访问。
复杂表达式中的操作数求值顺序并非都由源码从左到右保证;在缺少规定顺序的情况下对同一标量多次修改或修改后读取,可能产生未定义行为。工程上应拆成单一副作用语句。
最小堆能 O(1) 查看最近到期项,插入和删除根为 O(log n),适合动态定时器集合;线性表查找最近项为 O(n),但任务很少时实现更简单且常数更小。