相关疑难解决方法(0)

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

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

内联函数有什么缺点吗?

结论:

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

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

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

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

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

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

c++ inline-functions

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

为什么gcc在main的开头推动%rbx?

最新版本的gcc正在制作对我来说没有意义的装配.我没有使用优化编译代码; 但是,即使没有优化,此代码的某些部分也没有意义.

这是C源:

  #include <stdio.h>

   int main()
   {
     int a = 1324;
     int b = 5657;
     int difference = 9876;
     int printf_answer = 2221;

     difference = a - b;

     printf_answer = printf("%d + %d = %d\n", a, b, difference);

     return difference;
   }
Run Code Online (Sandbox Code Playgroud)

它产生这个组件:

    .file   "exampleIML-1b.c"
    .section    .rodata
.LC0:
    .string "%d + %d = %d\n"
    .text
.globl main
    .type   main, @function
main:
.LFB0:
    .cfi_startproc
    pushq   %rbp
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    movq    %rsp, %rbp
    .cfi_def_cfa_register 6
    pushq   %rbx
    subq    $24, %rsp …
Run Code Online (Sandbox Code Playgroud)

assembly gcc

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

C++内联函数强制其参数被复制?

我最近决定整理一个头文件,它有很多定义,如下所示:

// api.h
template< typename T>
inline void func( T param )
{
    // stuff here
}
Run Code Online (Sandbox Code Playgroud)

所以我想把它变成:

// api.h
#include "api_details.h"
template< typename T>
inline void func( T param )
{
    return details::func( param );
}

// api_details.h
namespace details {
    template< typename T>
    inline void func( T param )
    {
        // stuff here
    }
}
Run Code Online (Sandbox Code Playgroud)

希望这inline不会增加我正在执行的额外副本的成本.

虽然' C++中的答案做内联函数会阻止复制吗?"似乎暗示没有复制,这个问题出现了:

如果内联不复制函数参数,那么下面的行为会不会很糟糕?

inline void change_value( int i ) {
    i++;
}

...
int x=5;
change_value(x);
assert(x==5); …
Run Code Online (Sandbox Code Playgroud)

c++ inline

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

标签 统计

c++ ×2

assembly ×1

gcc ×1

inline ×1

inline-functions ×1