我的代码中经常有这样的陈述:
(b != 0) ? a / b : a
就速度和最佳C ++实践而言,做一个函数是否更好
float divifnotzero(a,b) { ... return ... }
或像这样的预处理器宏?
#define divifnotzero(a,b) ((b!=0)?a/b:a)
答案 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]
] );
关键字的预处理器宏一样内联,从而消除了开销。编译器通常可以决定是否内联函数本身;像这样的人几乎肯定会发生这种情况。转到函数调用,除非你在没有优化的情况下专门编译程序,同时仍然评估速度。