Normaly如果我制作一个小代码snipet,我通常把它放在whathever.c文件中。从C文件中我包含一个.h -file和其他包含或一些全局变量。
我刚刚听说编译器会使代码更快地出现,或者如果有人可以解释或评论这个代码,我会很高兴。
标题中的示例代码而不是c文件(可以在c中) - >
#define PWM_INTERRUPT \
void InterruptHook(void) \
{ \
PR4 ^= _SoftPWM_Toggle; \
\
PIR3bits.TMR4IF = 0; \
\
_asm \
INCF PR4,0,ACCESS \
CPFSLT TMR4,ACCESS \
_endasm \
\
/* if(TMR4 > PR4) */ \
PIR3bits.TMR4IF = 1; \
\
SOFT_PWM_PIN ^= 1; \
\
_asm \
RETFIE 1 \
_endasm \
}
答案 0 :(得分:4)
您不能将宏放在单独的.c文件中,因为宏是由预处理器处理的,这是编译过程的第一步,并且在链接阶段处理单独的.c文件,这是最后一步。
使用宏而不是函数可能更快,因为它避免了函数调用的开销。但是,它会降低编译速度,因为它会多次编译相同的代码。由于冗余副本,它会使您的代码更大。如果缓存是一个问题,它可能实际上运行较慢,因为反复将不同的冗余副本提取到缓存中。没有分析就没有办法确定。
如果您正在讨论将宏放在相同的 .c文件和头文件之间的区别,那么在性能方面没有区别。您只需要将其复制并粘贴到使用它的每个.c文件中。
答案 1 :(得分:1)
你听到的“谣言”与一些编译器(最着名的C ++)倾向于内联代码的方式有关,它放在.h文件中。
这个link(Michael Barr's)提供了一些关于C头文件中属于(和不属于)的非常好的提示。
答案 2 :(得分:0)
在编译 .c / .cpp文件之前,预处理器会将所有#include指令替换为给定* .h文件=>的内容。这最终在一个文件中,用于编译器=>源文件和头文件之间的性能没有差异。
答案 3 :(得分:0)
在你的例子中,宏是在头文件中定义的,以便在多个编译单元(c文件)中使用 - 我怀疑它与速度有什么关系。
答案 4 :(得分:0)
实际上,另一个答案是:在宏中声明高优先级中断时,宏中的代码是唯一一个去那里的代码,快速执行中断处理程序。
当我将宏外部的中断定义为普通函数时,我注意到编译器在中断rutine中放入了很多代码,代码我在MPLAB IDE中使用Disassambly Listing看不到whitout。
后来我的rutine从16个周期减慢到168个。