相关疑难解决方法(0)

C++中内联函数的好处?

在C++中使用内联函数的优点/缺点是什么?我看到它只会提高编译器输出的代码的性能,但是使用今天的优化编译器,快速CPU,大容量存储器等(不像1980年那样<内存稀缺,一切都必须适合100KB内存)什么他们今天真的有优势吗?

c++ inline-functions

253
推荐指数
6
解决办法
17万
查看次数

何时使用内联功能何时不使用?

我知道inline是对编译器的提示或请求,用于避免函数调用开销.

那么在什么基础上可以确定函数是否是内联的候选者?在哪种情况下应该避免内联?

c c++ inline

173
推荐指数
5
解决办法
9万
查看次数

内联函数与预处理器宏

内联函数与预处理器宏有何不同?

c c++ macros inline

107
推荐指数
6
解决办法
8万
查看次数

使用内联函数有什么问题?

虽然在某些情况下使用内联函数会非常方便,

内联函数有什么缺点吗?

结论:

显然,使用内联函数没有任何问题.

但值得注意的是以下几点!

  • 过度使用内联实际上可以使程序变慢.根据函数的大小,内联它可能会导致代码大小增加或减少.内联一个非常小的访问器函数通常会减少代码大小,而内联一个非常大的函数可以大大增加代码大小.在现代处理器上,较小的代码通常由于更好地使用指令缓存而运行得更快. - Google指南

  • 随着函数大小的增加,内联函数的速度优势趋于减小.在某些时候,与函数体的执行相比,函数调用的开销变小,并且失去了好处- Source

  • 内联函数可能无法正常工作的情况很少:

    • 对于返回值的函数; 如果存在return语句.
    • 对于不返回任何值的函数; 如果存在循环,开关或goto语句.
    • 如果函数是递归的.-资源
  • __inline仅当指定optimize选项时,关键字才会使函数内联.如果指定了optimize,则是否__inline遵循优先级取决于内联优化程序选项的设置.默认情况下,只要运行优化程序,内联选项就会生效.如果指定optimize,则还必须指定noinline选项(如果要__inline忽略关键字).-资源

c++ inline-functions

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

内联函数

内联是什么?

它是干什么用的?

你能用C#内联一些东西吗?

c# inlining

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

在for构造中使用size()表示第二个表达式总是坏的吗?

在下面的例子中我应该期望values.size()每次循环都会调用它吗?在这种情况下,引入临时vectorSize变量可能是有意义的.或者现代编译器是否能够通过识别向量大小无法改变来优化调用.

double sumVector(const std::vector<double>& values) {
    double sum = 0.0;
    for (size_t ii = 0; ii < values.size(); ++ii) {
        sum += values.at(ii);
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,我不关心是否有更有效的方法来对向量的内容求和,这个问题只是在for构造中使用size().

c++

8
推荐指数
4
解决办法
592
查看次数

每次输入后刷新stdin - 哪种方法不是错误的?

Mark Lakata指出,垃圾无法正常在我的问题我定义想出了这一点.我会保持更新,以避免混淆.


我试图获得一个函数,我可以在提示用户输入之前调用,如printf("Enter your choice:);跟随a,scanf并确保只有在提示后输入的内容才会被scanf作为有效输入扫描.

据我所知,所需的功能是完全冲洗标准输入的东西.这就是我想要的.因此,对于此功能而言"garbage",用户输入中的所有内容,即在该用户提示之前的整个用户输入.


scanf()在C中使用时,总是存在输入缓冲区中存在额外输入的问题.所以我在寻找一个我在每次scanf调用后调用的函数来解决这个问题.我用这个,这个,这个这个来得到这些答案

//First approach
scanf("%*[^\n]\n");

//2ndapproach
scanf("%*[^\n]%*c");

//3rd approach
int c;
while((c = getchar()) != EOF) 
    if (c == '\n') 
        break;
Run Code Online (Sandbox Code Playgroud)

所有这三个都是通过命中试验和参考文献找到的.但是在我的所有代码中使用任何这些代码之前,我想知道这些代码中是否有任何错误?

编辑:

感谢Mark Lakata的第3个错误.我在问题中纠正了它.

EDIT2:

Jerry Coffin回答之后,我在代码中使用该程序测试了前两种方法:使用GNU GCC编译器阻止IDE 12.11(版本未在编译器设置中声明).

#include<stdio.h>

int main()
{
    int x = 3; //Some arbitrary value
    //1st one
    scanf("%*[^\n]\n");
    scanf("%d", &x);
    printf("%d\n", x);

    x = 3;
    //2nd …
Run Code Online (Sandbox Code Playgroud)

c flush

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

如果我将一个大函数声明为内联函数怎么办?

我搜索了一些相关的问题(例如C++中的内联函数的好处?),但我仍有疑问.

如果内联函数只是"为编译器提供一个简单的机制来应用更多的OPTIMIZATIONS".

  1. 那么我可以将每个函数设置为内联函数吗?
  2. 如果我错误地将函数设置为内联函数,那么性能会发生什么?
  3. 任何告诉我函数大小不应该是内联函数的阈值?

c++ performance inline

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

标签 统计

c++ ×6

c ×3

inline ×3

inline-functions ×2

c# ×1

flush ×1

inlining ×1

macros ×1

performance ×1