Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 哪个内联函数或宏更快_C++_C_Performance_Function_Macros - Fatal编程技术网

C++ 哪个内联函数或宏更快

C++ 哪个内联函数或宏更快,c++,c,performance,function,macros,C++,C,Performance,Function,Macros,我认为预处理器在编译之前将宏扩展为代码中的一个副本文本,无论它在哪里被调用,而编译器在每次函数调用中都编写一份编译后的函数定义副本。因此,在这两种情况下,我们都避免了常规函数调用的开销,但在这种情况下,内联函数还是宏,哪个更快,开销更小 如果宏是否内联,则宏只会“更快”,而不会留给编译器启发。考虑到宏的缺点,通常最好由编译器来决定。调试级别和相应的源代码也存在问题。优化级别,“强制”内联,例如,\uuuuuu属性((\uuuu始终\uu内联))(gcc/clang)。更重要的是,可以避免常见的陷

我认为预处理器在编译之前将宏扩展为代码中的一个副本文本,无论它在哪里被调用,而编译器在每次函数调用中都编写一份编译后的函数定义副本。因此,在这两种情况下,我们都避免了常规函数调用的开销,但在这种情况下,内联函数还是宏,哪个更快,开销更小

如果宏是否内联,则宏只会“更快”,而不会留给编译器启发。考虑到宏的缺点,通常最好由编译器来决定。调试级别和相应的源代码也存在问题。优化级别,“强制”内联,例如,
\uuuuuu属性((\uuuu始终\uu内联))
(gcc/clang)。更重要的是,可以避免常见的陷阱,例如宏中的多表达式扩展/计算


我还没有做过S.O.问题搜索(你应该养成这样做的习惯),但我怀疑这个问题很久以前就已经得到了回答,更详细

你能在预处理的代码中给我看两者的区别吗?例如我有MAX(x,y)(x>y?x:y)。。。。int(intx,inty){返回x>y?x:y;}更快?你的意思是开始工作?鉴于一个简单的宏可能需要48小时才能正常工作,因为宏会生成“My macro not work right”(我的宏无法正常工作)Q&a,内联代码的速度要快很多倍10。在大多数情况下,你需要获得500毫秒以上的时间才能使时间变得可以忽略不计。使用内联函数节省的时间(可能是纳秒,也可能是微秒)浪费在等待I/O或操作系统调出程序(并运行另一个任务)上。更愿意把时间花在正确性和健壮性上。大多数用户讨厌经常崩溃的快速程序。顺便说一句,500毫秒或1/2秒是两次击键之间的快速时间。OTOH,如果编译器没有内联函数,可能有很好的理由不这样做。它甚至可以加快代码的速度!你错过了其他重要的区别。也许寻找一个更好的选择dup@Olaf-我肯定错过了其他用途。宏仍然出现在高性能代码中。例如,Linux和其他高性能软件中的块宏。例如,非尾部递归调用不能内联。由“轻量级”可见函数调用的翻译单元中的昂贵静态函数会使代码膨胀。还有其他原因需要宏,特别是在汇编代码或类似模板的代码生成中。例如,断点指令需要立即操作数,gcc无法将内联参数正确地传递给
asm
约束,因此汇编程序抱怨。但是现在大多数宏都已经过时了,并且通常源于ppl,他们只是错过/忽略了最新的进展(包括LTO)。提出上述问题的人通常不需要像宏那样的函数(无意冒犯,只是观察)。@Olaf-现代C/C++中的最后手段。。。但我们不能完全摆脱他们,就像每个人最喜欢的疯狂叔叔一样,
goto
:)这就是我的观点。在C++中,请注意C++(C/C++),它经常被初学者误解,甚至一些自称为专业人士。在某种程度上,我自己也使用了它们,但我会谨慎地使用它们,并且总是有很好的文档证明为什么它不能成为
内联
函数。