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