我知道编译器可能会也可能不会执行函数的内联扩展,无论程序员是否请求.
我只是很想知道,有没有什么方法可以让程序员确定编译器已经内联了一个特定的函数?
据我所知,C内联函数体应该在.h文件中定义,因为它会导致错误'函数名使用但从未定义'如果在.c文件中定义了body.
这是常规方式吗?或者如何在.c文件中定义内联函数体?
我在计算机上运行了我的基准测试(英特尔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'存在时,为什么函数指针比内联函数更快?
要将inline函数定义放在C头文件中以便应该内联到多个其他单元的函数中,应该使用inline还是static inline应该使用?我一直在谷歌搜索一段时间,但到目前为止似乎没有简明的解释.
我有这个代码:
// 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变量对程序全局,以便变量是唯一的。
我的问题是:
inlinerequire 语句_next_uid在编译单元之外是否可见?注意:这似乎并没有清楚地回答这些问题。
inline在说明符的 cppreference 页面上,它说:
inline当在函数的decl-specifier-seq中使用说明符时,该说明符将该函数声明为内联函数。
内联函数具有以下属性:程序中
可以有多个内联函数的定义,只要每个定义出现在不同的翻译单元中并且所有定义都相同。
...
然后,稍微低一点,它说,
该关键字的最初目的
inline是向优化器指示函数的内联替换优于函数调用。...
除了这一行之外,没有任何关于 的使用的参考inline。后一个含义inline在 C++ 标准中仍然有效吗?或者后一种形式是否比前一种形式被弃用?
如果后一种形式仍然有效,是否值得在现代编译器中使用它?我听说,即使是编译器做出内联决定,但使用inline关键字会稍微推动它。这是真的?对于这种情况,我应该inline在程序中使用关键字吗?
我试图通过从私有范围内的函数中剥离参数来清理代码,如下所示:
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不会被传递到它.
何时表达式包含在标记为内联的函数内,被认为是"潜在评估"?
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
我是 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' 的子类型