我为什么要这样做:
inline double square (double x) { return x*x;}
Run Code Online (Sandbox Code Playgroud)
代替
double square (double x) { return x*x;}
Run Code Online (Sandbox Code Playgroud)
有区别吗?
我在Stack Overflow中搜索了类似函数的宏与内联函数的优缺点.
我发现了以下讨论: C中不同宏函数/内联方法的优缺点
......但它没有回答我的主要问题.
也就是说,在内存使用和执行速度方面,使用宏函数(带有变量,可能还有其他函数调用)和内联函数的开销是多少?
开销中是否存在编译器相关的差异?我同时拥有icc和gcc.
我模块化的代码片段是:
double AttractiveTerm = pow(SigmaSquared/RadialDistanceSquared,3);
double RepulsiveTerm = AttractiveTerm * AttractiveTerm;
EnergyContribution +=
4 * Epsilon * (RepulsiveTerm - AttractiveTerm);
Run Code Online (Sandbox Code Playgroud)
我将其转换为内联函数/宏的原因是我可以将其放入ac文件中,然后有条件地编译其他类似但略有不同的函数/宏.
例如:
double AttractiveTerm = pow(SigmaSquared/RadialDistanceSquared,3);
double RepulsiveTerm = pow(SigmaSquared/RadialDistanceSquared,9);
EnergyContribution +=
4 * Epsilon * (RepulsiveTerm - AttractiveTerm);
Run Code Online (Sandbox Code Playgroud)
(注意第二行的差异......)
这个函数是我的代码的核心功能,在我的程序中每步调用数千次,我的程序执行数百万步.因此,我希望尽可能减少开销,因此我浪费时间来担心内联的转换,将代码转换为宏.
根据之前的讨论,我已经意识到宏的其他优点/缺点(类型独立性和由此产生的错误)...但我最想知道的,目前不知道的是性能.
我知道你们中的一些C老兵会对我有一些很好的见解!
我是一名C/C++开发人员,这里有几个问题总让我感到困惑.
谢谢
正如标题所说; inline关键字和#define预处理程序指令之间的区别是什么?
根据C FAQ,基本上有3种用于在C中"内联"代码的实用方法:
#define MACRO(arg1, arg2) do { \
/* declarations */ \
stmt1; \
stmt2; \
/* ... */ \
} while(0) /* (no trailing ; ) */
Run Code Online (Sandbox Code Playgroud)
要么
#define FUNC(arg1, arg2) (expr1, expr2, expr3)
Run Code Online (Sandbox Code Playgroud)
为了澄清这一点,参数在表达式中使用,逗号运算符返回最后一个表达式的值.
要么
使用inline支持作为gcc扩展和c99标准的声明.
该do { ... } while (0)方法在Linux内核中被广泛使用,但是我还没有经常遇到其他两种方法.
我指的是多语句"函数",而不是像MAX或MIN这样的单语句.
每种方法的优点和缺点是什么,为什么在各种情况下你会选择一种方法呢?
我是C++的初学者,我只是通过在需要时替换文本来阅读宏.在这种情况下,这是否意味着它使.exe运行得更快?这与内联函数有什么不同?
例如,如果我有以下宏:
#define SQUARE(x) ((x) * (x))
Run Code Online (Sandbox Code Playgroud)
正常功能:
int Square(const int& x)
{
return x*x;
}
Run Code Online (Sandbox Code Playgroud)
和内联函数:
inline int Square(const int& x)
{
return x*x;
}
Run Code Online (Sandbox Code Playgroud)
这三者之间的主要区别是什么,特别是内联函数和宏之间有什么区别?谢谢.
使用 Lua 5.3.5 和 gcc 9.2.0 的开发库我遇到了以下最小片段的奇怪编译问题:
#include <functional>
extern "C" {
#include "lua.h"
#include "lualib.h"
}
int main()
{
using namespace std::placeholders;
auto lua_simple_call = std::bind(lua_call, _1, 0, 0);
}
Run Code Online (Sandbox Code Playgroud)
gcc 抱怨:error: ‘lua_call’ was not declared in this scope. 尝试在lua_call不使用的情况下简单调用时不会发生此问题,std::bind并且其他 Lua C 函数(如lua_newtable等)似乎也不会发生此问题。我想知道是什么导致了这种情况以及如何规避它。
有人告诉我#define很糟糕.好吧,老实说我不明白为什么不好.如果它不好,那么我可以用其他方式做到这一点呢?
#include <iostream>
#define stop() cin.ignore(numeric_limits<streamsize>::max(), '\n');
Run Code Online (Sandbox Code Playgroud) 我指的是这个问题
#define max(a,b) ((a<b)?b:a)
这会产生一些副作用,如答案所述;
如果您使用max(a ++,b ++)作为示例(a或b将增加两次),则会出现副作用
我无法理解这种副作用; 当我们使用max(a ++,b ++)时,为什么a或b会递增两次?
例如,我有以下字符串,
if (str[i] == '(' ||
str[i] == ')' ||
str[i] == '+' ||
str[i] == '-' ||
str[i] == '/' ||
str[i] == '*')
Run Code Online (Sandbox Code Playgroud)
我的问题是有一个简洁的方法来说明这个值是否是c ++中这些值集合之一?
c ×7
c++ ×6
inline ×6
macros ×4
optimization ×2
c++11 ×1
iostream ×1
lua ×1
performance ×1
preprocessor ×1
tradeoff ×1