c++ inline

inline

inline cppreference

重定义

举例:

.LC0:
        .string "\345\245\207"
.LC1:
        .string "\345\201\266"
num_check(int):
        push    rbp
        mov     rbp, rsp
        mov     DWORD PTR [rbp-4], edi
        mov     edx, DWORD PTR [rbp-4]
        mov     eax, edx
        sar     eax, 31
        shr     eax, 31
        add     edx, eax
        and     edx, 1
        sub     edx, eax
        mov     eax, edx
        test    eax, eax
        jle     .L2
        mov     eax, OFFSET FLAT:.LC0
        jmp     .L4
.L2:
        mov     eax, OFFSET FLAT:.LC1
.L4:
        pop     rbp
        ret
.LC2:
        .string "%02d %s\n"
main:
        push    rbp
        mov     rbp, rsp
        sub     rsp, 16
        mov     DWORD PTR [rbp-4], 0
        jmp     .L6
.L7:
        mov     eax, DWORD PTR [rbp-4]
        mov     edi, eax
        call    num_check(int)
        mov     rdx, rax
        mov     eax, DWORD PTR [rbp-4]
        mov     esi, eax
        mov     edi, OFFSET FLAT:.LC2
        mov     eax, 0
        call    printf
        add     DWORD PTR [rbp-4], 1
.L6:
        cmp     DWORD PTR [rbp-4], 99
        jle     .L7
        mov     eax, 0
        leave
        ret

可以明显发现,此时是正常的函数调用,
那如何才能内联优化呢
可以在函数前使用[[gnu::always_inline]]或者__attribute__((always_inline)),比如

[[gnu::always_inline]] inline const char* num_check(int v) {
    return (v % 2 > 0) ? "奇" : "偶";
}

其实只要设置编译优化-O1 就会自动优化

内联 const 变量默认拥有外部链接

类成员函数与模板函数默认 inline

  • 类中直接定义的成员函数默认是 inline 的(即允许多重定义)
struct S {
    int get() const { return 42; } // 默认 inline
};
  • 模板函数直接定义时也是默认 inline
template<typename T>
T square(T x) { return x * x; } // 默认 inline

static

让被修饰内容仅在当前翻译单元(Translation Unit)可见
ODR

Other

[!note]
头文件可以使用#pragma once,虽然被很多编译器支持,但这个并不是标准库的内容

posted @ 2025-04-01 13:55  又玄  阅读(30)  评论(1)    收藏  举报