相关疑难解决方法(0)

c ++内联函数?

我为什么要这样做:

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)

有区别吗?

c++ inline

68
推荐指数
4
解决办法
5万
查看次数

内联功能v.C中的宏 - 什么是开销(内存/速度)?

我在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 macros optimization performance inline

33
推荐指数
3
解决办法
3万
查看次数

我为什么要使用内联代码?

我是一名C/C++开发人员,这里有几个问题总让我感到困惑.

  • "常规"代码和内联代码之间有很大区别吗?
  • 哪个是主要区别?
  • 内联代码只是宏的"形式"吗?
  • 在选择内联代码时必须做出哪些权衡?

谢谢

c++ optimization tradeoff inline-functions

31
推荐指数
4
解决办法
2万
查看次数

内联函数与宏函数

可能重复:
内联函数与预处理器宏

我想知道内联函数和宏函数之间的区别.

1)内联函数是否与宏函数相同?

2)我知道两者都没有被调用,但它们在编译阶段被代码替换.不是?

3)如果有差异,你能指定吗?

c macros inline

16
推荐指数
3
解决办法
8万
查看次数

内联和#define之间的实践有什么区别?

正如标题所说; inline关键字和#define预处理程序指令之间的区别是什么?

c inline c-preprocessor

10
推荐指数
1
解决办法
1万
查看次数

C语言中不同宏功能/内联方法的优缺点

根据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 macros inline

9
推荐指数
2
解决办法
6856
查看次数

C++中的宏可以提高性能吗?

我是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)

这三者之间的主要区别是什么,特别是内联函数和宏之间有什么区别?谢谢.

c c++ macros preprocessor inline

3
推荐指数
1
解决办法
2532
查看次数

std::bind 不能与 lua_call 互操作

使用 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等)似乎也不会发生此问题。我想知道是什么导致了这种情况以及如何规避它。

c++ lua c++11

3
推荐指数
1
解决办法
63
查看次数

为什么#define不好?

可能重复:
C++宏什么时候有用?
为什么#define不好,什么是正确的替代品?

有人告诉我#define很糟糕.好吧,老实说我不明白为什么不好.如果它不好,那么我可以用其他方式做到这一点呢?

#include <iostream>
#define stop() cin.ignore(numeric_limits<streamsize>::max(), '\n');
Run Code Online (Sandbox Code Playgroud)

c c++ iostream c-preprocessor

1
推荐指数
1
解决办法
2105
查看次数

了解#define用法中的副作用

我指的是这个问题

#define max(a,b) ((a<b)?b:a)

这会产生一些副作用,如答案所述;

如果您使用max(a ++,b ++)作为示例(a或b将增加两次),则会出现副作用

我无法理解这种副作用; 当我们使用max(a ++,b ++)时,为什么a或b会递增两次?

c

1
推荐指数
1
解决办法
76
查看次数

简洁的说法等于C++中的值集

例如,我有以下字符串,

if (str[i] == '(' ||
    str[i] == ')' ||
    str[i] == '+' ||
    str[i] == '-' ||
    str[i] == '/' ||
    str[i] == '*')
Run Code Online (Sandbox Code Playgroud)

我的问题是有一个简洁的方法来说明这个值是否是c ++中这些值集合之一?

c++

1
推荐指数
1
解决办法
142
查看次数