例如,这个:
#define FPGA_INIT()\
{ \
/* Set function and direction of start_code pin*/\
P0SEL &= ~0x04; \
P0DIR |= 0x04; \
FPGA_START_CODE = 0; \
}
还是这个?
static void fpga_init()
{
/* Set function and direction of start_code pin*/
P0SEL &= ~0x04;
P0DIR |= 0x04;
FPGA_START_CODE = 0;
}
内存放置有什么不同?
答案 0 :(得分:6)
通常,当您需要预处理器的功能在编译之前操作代码时,最好保留使用预处理器宏 - 您不应该使用预处理器宏来定义可以实现的过程作为正常功能。因为预处理器会在调用宏的任何地方替换宏代码,所以很难调试发生的错误。例如,如果调用FPGA_INIT()宏,(可能)全局变量P0SEL,P0DIR和FPGA_START_CODE可能会被同名的本地人隐藏。
如果声明了一个fpga_init()函数,编译器会将该函数的代码与您声明的其他函数的代码放在一起,根据它所知道的针对您所针对的平台的规则。如果声明一个FPGA_INIT()宏,编译器将永远不会知道它存在,因为所有对它的引用都将由预处理器解析;编译器将在调用它的每个函数中单独查看和编译宏的语句。
除非您需要以极高的频率调用此代码(在内部循环中),否则宏和函数实现的性能可能无法区分。如果确实需要经常调用代码,则应尝试以各种方式测量性能:根据处理器的体系结构,使用预处理器将代码内联放置可能会更快,或者使用代码可能更快在一个单独的函数中(特别是如果扩展每次调用都会导致一个重要的循环溢出缓存行)。
答案 1 :(得分:3)
如果您使用宏,那么无论您在何处使用它,预处理器都会将其替换为全身。这意味着如果你说它10次,那么你需要10倍的内存。但是代码执行得更快,因为没有进行函数调用的开销。
我通常会避免将宏用于函数。宏很难调试和维护。如果您需要就地代码,则更简洁的解决方案是使用inline functions,这是大多数现代编译器所支持的。
答案 2 :(得分:1)
宏可以节省操作期间函数调用的开销(速度)。
一个函数可以节省在多个地方(程序空间)使用相同代码的开销。
选择哪个速度和空间对您来说更重要,并使用适当的选项。
答案 3 :(得分:1)
将函数放入头文件中,并使用inline
关键字作为前缀:
inline void fpga_init()
{
/* Set function and direction of start_code pin*/
P0SEL &= ~0x04;
P0DIR |= 0x04;
FPGA_START_CODE = 0;
}
inline关键字建议编译器将语句“in-inline”与其他代码放在一起,类似于#define
宏。这比宏更好,因为它的行为类似于函数,并且没有宏的缺陷。
答案 4 :(得分:0)
相信你的编译器 - 使它成为常规函数,让编译器选择如何处理它。
答案 5 :(得分:0)
考虑使用宏来实现init代码以节省内存空间,因为初始代码通常在使用后删除。