在C++中使用内联函数的优点/缺点是什么?我看到它只会提高编译器输出的代码的性能,但是使用今天的优化编译器,快速CPU,大容量存储器等(不像1980年那样<内存稀缺,一切都必须适合100KB内存)什么他们今天真的有优势吗?
我知道inline是对编译器的提示或请求,用于避免函数调用开销.
那么在什么基础上可以确定函数是否是内联的候选者?在哪种情况下应该避免内联?
我有一个定义为的函数
inline void vec_add(__m512d &v3, const __m512d &v1, const __m512d &v2) {
v3 = _mm512_add_pd(v1, v2);
}
Run Code Online (Sandbox Code Playgroud)
(这__m512d是映射到Intel MIC架构上的SIMD寄存器的本机数据类型)
由于此函数相当短并且经常被调用,我希望它在每次调用时都被内联.但是,即使在我使用-inline-forceinline和-O3选项之后,英特尔的编译器似乎也不愿意内联这个函数.它在编译时报告'Forceinline不尊重电话......'.由于我必须使用某些编译器特定的功能,例如__m512d类型,因此英特尔编译器是我唯一的选择.
更多信息:
文件结构非常简单.该函数vec_add在头文件中定义,该文件mic.h包含在另一个文件中test.cc.函数vec_add只是在循环中重复调用,并且不涉及函数指针.一个简单的代码的版本test.cc看起来像这样
for (int i = 0; i < LENGTH; i += 8) {
// a, b, c are arrays of doubles, and each SIMD register can hold 8 doubles
__mm512d va = _mm512_load_pd(a + i); // load SIMD register …Run Code Online (Sandbox Code Playgroud) 我想知道是否有一些理论/工具可用于将包含函数调用的代码替换为代码,其中所有函数调用已被其各自的代码替换.
喜欢
main()
{
fun();
}
fun()
{
int i;
fun2();
}
fun2()
{
int j;
}
Run Code Online (Sandbox Code Playgroud)
成
main()
{
int i;
int j;
}
Run Code Online (Sandbox Code Playgroud)
我知道有很多需要注意的事情,比如局部变量名,递归调用,外部函数调用等等.. ..
我也知道它可能根本不是很有用,但仍然存在这样的事情吗?甚至在理论上?
我应该称它为每个处理器单位提前:)
我知道,为了缩短课程名称,我可以做以下事情:
using Time = std::chrono::time_point<std::chrono::system_clock>;
using Clock = std::chrono::system_clock;
Run Code Online (Sandbox Code Playgroud)
但如何正确减少下一行的长度?
/*using Ms = */ std::chrono::duration_cast<std::chrono::milliseconds>
Run Code Online (Sandbox Code Playgroud)
目标代码:
Time start = Clock::now();
// something
Time end = Clock::now();
std::cout << Ms(end - start).count() << std::endl;
Run Code Online (Sandbox Code Playgroud)