使用宏而不是函数会使二进制文件更大吗?
Does using macros instead of functions make the binary bigger?
使用宏会比使用函数产生更多的机器指令(以及二进制大小)吗?我问是因为我经常使用的一个宏变得非常大,所以我开始担心。我的印象是,宏被复制粘贴的次数与我使用它们的次数一样多。是真的吗?
我自己也可以测试一下,就是有点麻烦,也想听听有识之士怎么说。对于汇编语言,机器指令之类的东西,我是一个绝对的门外汉,如果我写了一些愚蠢的东西,请见谅。
可能是的,使用宏而不是函数可能会使二进制文件更大。但这取决于您的具体情况如何编译。
宏在编译进行之前展开,所以结果就像将代码复制到每个使用宏的函数中一样。编译器不太可能将这些代码片段提取到某个公共位置。
函数通常只存在于一个地方,调用它们会跳转到那个地方。但是,函数可能会像宏一样被扩展(内联)。但这只有在编译器认为它是有益的,或者如果你用 #[inline(always)]
.
注释函数时才会发生
一般来说,如果你能同时用函数和宏实现你需要的,就用函数。宏对于函数无法实现的特殊情况很有用。 (比如创建自定义语法,或获取调用站点的行号...)
使用宏会比使用函数产生更多的机器指令(以及二进制大小)吗?我问是因为我经常使用的一个宏变得非常大,所以我开始担心。我的印象是,宏被复制粘贴的次数与我使用它们的次数一样多。是真的吗?
我自己也可以测试一下,就是有点麻烦,也想听听有识之士怎么说。对于汇编语言,机器指令之类的东西,我是一个绝对的门外汉,如果我写了一些愚蠢的东西,请见谅。
可能是的,使用宏而不是函数可能会使二进制文件更大。但这取决于您的具体情况如何编译。
宏在编译进行之前展开,所以结果就像将代码复制到每个使用宏的函数中一样。编译器不太可能将这些代码片段提取到某个公共位置。
函数通常只存在于一个地方,调用它们会跳转到那个地方。但是,函数可能会像宏一样被扩展(内联)。但这只有在编译器认为它是有益的,或者如果你用 #[inline(always)]
.
一般来说,如果你能同时用函数和宏实现你需要的,就用函数。宏对于函数无法实现的特殊情况很有用。 (比如创建自定义语法,或获取调用站点的行号...)