标签: inline-functions

内联函数

我知道编译器可能会也可能不会执行函数的内联扩展,无论程序员是否请求.
我只是很想知道,有没有什么方法可以让程序员确定编译器已经内联了一个特定的函数?

c++ inline-functions

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

有没有办法在.c文件而不是.h文件中定义C内联函数?

据我所知,C内联函数体应该在.h文件中定义,因为它会导致错误'函数名使用但从未定义'如果在.c文件中定义了body.

这是常规方式吗?或者如何在.c文件中定义内联函数体?

c header inline-functions

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

函数指针比内联函数运行得更快.为什么?

我在计算机上运行了我的基准测试(英特尔i3-3220 @ 3.3GHz,Fedora 18),并得到了非常意外的结果.函数指针实际上比内联函数快一点.

码:

#include <iostream>
#include <chrono>
inline short toBigEndian(short i)
{
    return (i<<8)|(i>>8);
}
short (*toBigEndianPtr)(short i)=toBigEndian;
int main()
{  
    std::chrono::duration<double> t;
    int total=0;
    for(int i=0;i<10000000;i++)
    {
        auto begin=std::chrono::high_resolution_clock::now();
        short a=toBigEndian((short)i);//toBigEndianPtr((short)i);
        total+=a;
        auto end=std::chrono::high_resolution_clock::now();
        t+=std::chrono::duration_cast<std::chrono::duration<double>>(end-begin);
    }
    std::cout<<t.count()<<", "<<total<<std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

用.编译

g++ test.cpp -std=c++0x -O0
Run Code Online (Sandbox Code Playgroud)

'toBigEndian'循环总是在0.26-0.27秒左右完成,而'toBigEndianPtr'则需要0.21-0.22秒.

更奇怪的是,当我删除'total'时,函数指针在0.35-0.37秒处变慢,而内联函数在约0.27-0.28秒.

我的问题是:

当'total'存在时,为什么函数指针比内联函数更快?

c++ performance function-pointers inline-functions

5
推荐指数
2
解决办法
2617
查看次数

头文件中的内联与静态内联

要将inline函数定义放在C头文件中以便应该内联到多个其他单元的函数中,应该使用inline还是static inline应该使用?我一直在谷歌搜索一段时间,但到目前为止似乎没有简明的解释.

c static inline-functions

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

我可以内联使用静态变量的函数吗?

我有这个代码:

// my.h

#ifndef MY_HEADER
#define MY_HEADER

int create_uid();

#endif
Run Code Online (Sandbox Code Playgroud)
// my.cpp

#include "my.h"

static int _next_uid = 0;

int create_uid()
{
    return _next_uid++;
}
Run Code Online (Sandbox Code Playgroud)

我想内联create_uid(),同时保持_next_uid变量对程序全局,以便变量是唯一的。

我的问题是:

  1. 我可以这样做吗?
  2. inlinerequire 语句_next_uid在编译单元之外是否可见?

注意:似乎并没有清楚地回答这些问题。

c++ static-variables inline-functions

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

C++ 中 inline 关键字的旧含义是否已弃用?

inline在说明符的 cppreference 页面上,它说:

inline当在函数的decl-specifier-seq中使用说明符时,该说明符将该函数声明为内联函数

联函数具有以下属性:程序中
可以有多个内联函数的定义,只要每个定义出现在不同的翻译单元中并且所有定义都相同。
...

然后,稍微低一点,它说,

该关键字的最初目的inline是向优化器指示函数的内联替换优于函数调用。...

除了这一行之外,没有任何关于 的使用的参考inline。后一个含义inline在 C++ 标准中仍然有效吗?或者后一种形式是否比前一种形式被弃用?

如果后一种形式仍然有效,是否值得在现代编译器中使用它?我听说,即使是编译器做出内联决定,但使用inline关键字会稍微推动它。这是真的?对于这种情况,我应该inline在程序中使用关键字吗?

c++ inline inline-functions

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

嵌套函数是否可以在VBA中使用?

我试图通过从私有范围内的函数中剥离参数来清理代码,如下所示:

Function complicatedFunction(x as Double, param1 as Double, param2 as Double)
    ...
End Function

Function mainActionHappensHere(L as Double, U as Double ...)
    Function cleaner(x)
        cleaner = complicatedFunction(x, L, U)
    End Function
    ...
    cleaner(x)                       'Many calls to this function
    ...
End Function
Run Code Online (Sandbox Code Playgroud)

这可能吗?编译器抱怨"预期结束函数",因为我在结束外部函数之前开始执行函数.谷歌没有帮助:( PS我不能在mainActionHappensHere()之外定义cleaner(),因为那时正确的L和U不会被传递到它.

vba parameter-passing inline-functions nested-function

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

内联函数体的潜在评估和模板成员的实例化

何时表达式包含在标记为内联的函数内,被认为是"潜在评估"?

a.cpp

template <typename T>
const T& foo(const T& arg) { return arg; }

inline void dead() {
    int x(21);
    x = foo(x);
}
Run Code Online (Sandbox Code Playgroud)

b.cpp

#include <iostream>

template <typename T> const T& foo(const T&);

int main(int argc, char *argv[]) {
    std::cout << foo(12) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

如果在定义内联函数时将表达式视为"可能已评估",则应该实例化模板,并且我希望$(CCC) -c a.cpp; $(CCC) -c b.cpp; $(CCC) a.o b.o -o bin成功链接.相反,如果这样的函数本身变得使用了,那么在内联声明的函数中的表达式只会变为"可能被评估",那么我希望$(CCC) -c a.cpp; $(CCC) -c b.cpp; $(CCC) a.o b.o -o bin在链接步骤中失败.

到目前为止,我已经测试了xl C++ 12(成功链接)和各种版本的gcc + clang 3.5(所有这些都无法链接).

哪种行为是正确的?我在这里错过了第三种选择吗?

c++ one-definition-rule inline-functions language-lawyer c++11

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

如何强制OCaml内联函数?

是否有可能告诉OCaml编译器内联函数,而不是希望它的优化过程本身会这样做?

ocaml inline-functions

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

用于小部件属性的 flutter 匿名/内联函数

我是 dart 和 flutter 的新手,我正在尝试使用内联函数返回一个值。

SizedBox(
  height: _getheight()
),

double _getheight(){
//do some stuff
return 20.0;
}
//WORKS
Run Code Online (Sandbox Code Playgroud)
SizedBox(
height: (){return 20.0;}
),
//(Won't build)
Run Code Online (Sandbox Code Playgroud)

错误:参数类型“double Function()”无法分配给参数类型“double”。

SizedBox(
 height: (){return 20.0;} as double
),
Run Code Online (Sandbox Code Playgroud)

--构建但在运行时失败错误:类型 '() => double' 不是类型转换中类型 'double' 的子类型

inline-functions dart

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