假设我有一个遍历目录的C程序,并将目录条目元数据存储在名为struct dirent *
的{{1}}中。程序多次访问字段dir
。我想知道设置辅助字符指针(例如dir->d_name
)是否会使程序更快。我知道解除引用指针是一个相对昂贵的操作。问题是,如果我设置一个辅助变量,我仍然会取消引用指针;唯一的区别在于,在一种情况下,我取消引用指向结构的指针,而在第二种情况下,我取消引用指向字符串的指针。所以我想这里的关键问题是,访问结构的各个字段有多昂贵?我想在机器级别,这将涉及首先取消引用指向结构的指针以获取其地址,然后通过所需字段的偏移量递增该地址。对于辅助指针,您可以取消引用,此时您已经拥有该字符串的起始地址。
答案 0 :(得分:1)
我能给你的唯一答案是取决于。使用70年代的简单编译器(仅注意K& R C ...)或每个指令编译器的手工指令,使用寄存器变量作为辅助指针可以实现真正的优化。
通过一个不错的优化编译器,事情变得更加艰难。由于所谓的 as-if规则,只要可观察行为或程序与抽象机,其中所有表达式都按语义指定(ref n1570草案,用于C11 5.1.2.3程序执行)。因此,对于低级优化,您只能针对具有特定选项的特定编译器对不同版本的代码进行基准测试,或控制生成的程序集(或机器)代码。问题是它可能因不同选项的不同编译器而异。这就是为什么最佳实践建议不要关心低级优化,除非分析确定了瓶颈。