【发布时间】:2013-12-13 19:47:00
【问题描述】:
我正在用内联函数替换大型 C99 代码库中的宏,以查看编译器是否可以更好地进行优化。有很多宏可以扩展为数据结构。代码不是将它们用作函数,而是用作数据结构本身的替代品。
例如...
#define AvARRAY(av) ((av)->sv_u.svu_array)
AvARRAY(av)[--key] = &PL_sv_undef;
不仅有很多代码会这样做,我无法控制的已发布代码也会这样做,所以如果可能的话,我宁愿保留这个习语。
有没有办法定义与上述代码兼容的AvARRAY 的内联函数版本?
【问题讨论】:
-
您说目标是优化,您是否认为内联函数可以使用一些比指针偏移更快的魔术指令?您是否手动展开宏扩展并考虑过哪种功能可能更有效?
-
@kfsone 我了解到现在编译器通常比我聪明,而且我认为更多的结构和类型检查将使它有更多的工作空间。我还了解到,当我试图猜测编译器会做什么时,我经常会出错。我想看看会发生什么。最后,这个源代码中宏的广泛使用使得理解发生了什么和调试有点像噩梦。
-
在您给出的示例中,没有任何理由认为
inline函数会比宏更好地优化或节省。您只对参数进行一次评估,并且从使用来看,这个东西是非常安全的,因为您在参数上使用了->运算符。看起来你正在寻找一个幻影。 (为了更好地支持宏,我建议使用clang)我在你的代码中看到了一件令人讨厌的事情,那就是在另一个表达式中无偿使用--。