我应该将一些信息存储在一次一点的结构向量中。我事先知道数组的大小。我的问题是:我应该使用对我来说表示无效输入的结构初始化数组吗?例如,我应该执行以下操作:
typedef struct mystruct{
int ID;
int xvalue;
} my_struct;
#define NO_INPUT (my_struct) { ID=-1, xvalue=0}
其中 ID=-1 是一个对我来说没有意义的输入。定义后,我应该将数组初始化为NO_INPUT吗?最佳实践是什么?PS #define 指令对吗?它是否与C89标准兼容?提前感谢!
选择在不需要时初始化存储既有成本又有优势。C让你选择你的毒药。
成本是触及每个分配的字节。对于大型阵列,这可能很昂贵。它可能会损害 CPU 缓存性能。某些 C 运行时不会将malloc
ed 页面映射到程序的地址空间,直到它们被触及。初始化它们会破坏此优化。
优点是可以缓解和修复错误。取消引用初始化为 NULL 的指针会导致许多现代操作系统/CPU 立即出现 seg 错误。这种"快速失败"的行为是一件好事。未初始化的指针可以指向真实数据,因此错误的代码会继续运行,产生错误的答案或失败很久。初始化的值在调试器和错误消息中也更有意义。它们还可以添加自初始化以来未使用位置的断言,以检测意外覆盖。
由于这些优点,即使初始化成本太高,一些程序也设计有"调试模式",该模式要么包括额外的初始化和使用预处理器指令检查代码,要么在运行时动态启用/禁用它们。