如果不同于0除以

时间:2016-07-08 00:15:51

标签: c++ c-preprocessor division

我的代码中经常有这样的陈述:

(b != 0) ? a / b : a

就速度和最佳C ++实践而言,做一个函数是否更好

float divifnotzero(a,b) { ... return ... }

或像这样的预处理器宏?

#define divifnotzero(a,b) ((b!=0)?a/b:a)

2 个答案:

答案 0 :(得分:9)

预处理器只是在您使用宏的任何地方替换代码,因此没有区别。至于一个函数,你的编译器几乎肯定会内联它,所以再次应该没有速度差异。所以,鉴于我会使用函数来提高可读性。

答案 1 :(得分:1)

预处理器宏内联您放入的任何代码。函数调用允许您以一些轻微的开销为代价来减小可执行文件的大小。完全基于此,在这种情况下,您可能希望使用预处理器宏。

实际上,函数可以像使用// ==UserScript== // @name JustPaste.it CheckForBadScript // @namespace Mkhoul // @description Test 01 // @include https://justpaste.it/* // @version 1 // @require https://greasyfork.org/scripts/12317-checkforbadjavascripts-js/code/checkForBadJavascriptsjs.js?version=73234 // @run-at document-start // @grant GM_addStyle // ==/UserScript== /*- The @grant directive is needed to work around a design change introduced in GM 1.0. It restores the sandbox. MIKE MIKE MIKE */ function replaceTargetJavascript (scriptNode) { var scriptSrc = scriptNode.textContent; scriptSrc = scriptSrc.replace ( "meta,script,object,applet,iframe,option,embed,span[size|face],pre,font[style|face],h2[style],h1[style],h3[style],h[style],input,textarea,submit", "dummyoption" ); addJS_Node (scriptSrc); } checkForBadJavascripts ( [ [false, /invalid_elements/, replaceTargetJavascript] ] ); 关键字的预处理器宏一样内联,从而消除了开销。编译器通常可以决定是否内联函数本身;像这样的人几乎肯定会发生这种情况。转到函数调用,除非你在没有优化的情况下专门编译程序,同时仍然评估速度。