• C++ noexcept关键字有时候会导致函数体变大


    本身可以通过关闭C++异常支持,rtti支持来减少代码段的大小,使用如下的命令行参数:-fno-exceptions -fno-unwind-tables -fno-asynchronous-unwind-tables

    但是有时候却并不能彻底关闭,比如说unity引擎开发的ios游戏,il2cpp后的C++代码与其它代码混在一起,il2cpp的代码是需要异常支持的。此时我们可以考虑将自己的C++代码加上noexcept关键字,这样也可以减少代码段。

    但是有一些情况下,加noexcept并不能减少代码段,还可能会增加,看起来在这种情况下,“省略帧指针优化”将不起作用(这个优化的命令行为:omit-frame-pointer)

    举个例子:

     1 //
     2 // Encodes input (uint32) into output (uint8).
     3 // Assumes len is a multiple of 4.
     4 //
     5 __attribute__((__noinline__))
     6 __attribute__((visibility("default")))
     7 void __appMD5Encode_common(uint8* output, const uint32* input, int len)
     8 {
     9     int i, j;
    10 
    11     for (i = 0, j = 0; j < len; i++, j += 4) {
    12         output[j] = (uint8)(input[i] & 0xff);
    13         output[j + 1] = (uint8)((input[i] >> 8) & 0xff);
    14         output[j + 2] = (uint8)((input[i] >> 16) & 0xff);
    15         output[j + 3] = (uint8)((input[i] >> 24) & 0xff);
    16     }
    17 }
    18 
    19 __attribute__((__noinline__))
    20 __attribute__((visibility("default")))
    21 void __appMD5Encode_noexcept(uint8* output, const uint32* input, int len) noexcept
    22 {
    23     int i, j;
    24 
    25     for (i = 0, j = 0; j < len; i++, j += 4) {
    26         output[j] = (uint8)(input[i] & 0xff);
    27         output[j + 1] = (uint8)((input[i] >> 8) & 0xff);
    28         output[j + 2] = (uint8)((input[i] >> 16) & 0xff);
    29         output[j + 3] = (uint8)((input[i] >> 24) & 0xff);
    30     }
    31 }
    32 
    33 typedef void (*func_type)(uint8*, const uint32*, int);
    34 
    35 void* g_commonFuncPtr = (void*) & __appMD5Encode_common;
    36 void* g_noexceptFuncPtr = (void*)&__appMD5Encode_noexcept;
    37 
    38 
    39 __attribute__((visibility("default"))) void appMD5Encode_noexcept_call_common(uint8* output, const uint32* input, int len) noexcept
    40 {
    41     __appMD5Encode_common(output, input, len);
    42 }
    43 
    44 __attribute__((visibility("default"))) void appMD5Encode_noexcept_call_noexcept(uint8* output, const uint32* input, int len) noexcept
    45 {
    46     __appMD5Encode_noexcept(output, input, len);
    47 }
    48 
    49 __attribute__((visibility("default"))) void appMD5Encode_noexcept_call_common_pointer(uint8* output, const uint32* input, int len) noexcept
    50 {    
    51     ((void (*)(uint8*, const uint32*, int))g_commonFuncPtr)(output, input, len);
    52 }
    53 
    54 __attribute__((visibility("default"))) void appMD5Encode_noexcept_call_noexcept_pointer(uint8* output, const uint32* input, int len) noexcept
    55 {
    56     ((void (*)(uint8*, const uint32*, int))g_noexceptFuncPtr)(output, input, len);
    57 }
    58 
    59 __attribute__((visibility("default"))) void appMD5Encode_noexcept_call_common_pointer_extra_noexcept(uint8* output, const uint32* input, int len) noexcept
    60 {
    61     ((void (*)(uint8*, const uint32*, int) noexcept )g_commonFuncPtr)(output, input, len);
    62 }
    63 
    64 __attribute__((visibility("default"))) void appMD5Encode_noexcept_call_noexcept_pointer_extra_noexcept(uint8* output, const uint32* input, int len) noexcept
    65 {
    66     ((void (*)(uint8*, const uint32*, int) noexcept)g_noexceptFuncPtr)(output, input, len);
    67 }
    68 
    69 __attribute__((visibility("default"))) void appMD5Encode_common_call_common(uint8* output, const uint32* input, int len)
    70 {
    71     __appMD5Encode_common(output, input, len);
    72 }
    73 
    74 
    75 __attribute__((visibility("default"))) void appMD5Encode_common_call_noexcept(uint8* output, const uint32* input, int len)
    76 {
    77     __appMD5Encode_noexcept(output, input, len);
    78 }
    79 
    80 __attribute__((visibility("default"))) void appMD5Encode_common_call_common_pointer(uint8* output, const uint32* input, int len)
    81 {
    82     ((void (*)(uint8*, const uint32*, int))g_commonFuncPtr)(output, input, len);
    83 }
    84 
    85 __attribute__((visibility("default"))) void appMD5Encode_common_call_noexcept_pointer(uint8* output, const uint32* input, int len)
    86 {
    87     ((void (*)(uint8*, const uint32*, int))g_noexceptFuncPtr)(output, input, len);
    88 }
    89 
    90 __attribute__((visibility("default"))) void appMD5Encode_common_call_common_pointer_extra_noexcept(uint8* output, const uint32* input, int len)
    91 {
    92     ((void (*)(uint8*, const uint32*, int) noexcept)g_commonFuncPtr)(output, input, len);
    93 }
    94 
    95 __attribute__((visibility("default"))) void appMD5Encode_common_call_noexcept_pointer_extra_noexcept(uint8* output, const uint32* input, int len)
    96 {
    97     ((void (*)(uint8*, const uint32*, int) noexcept )g_noexceptFuncPtr)(output, input, len);
    98 }

    观察汇编可以发现端倪:

    .text:000000000000F10C ; =============== S U B R O U T I N E =======================================
    .text:000000000000F10C
    .text:000000000000F10C
    .text:000000000000F10C ; __int64 __fastcall __appMD5Encode_common(unsigned __int8 *, const unsigned int *, int)
    .text:000000000000F10C                 EXPORT _Z21__appMD5Encode_commonPhPKji
    .text:000000000000F10C _Z21__appMD5Encode_commonPhPKji         ; CODE XREF: __appMD5Encode_common(uchar *,uint const*,int)+C↑j
    .text:000000000000F10C                                         ; appMD5Encode_noexcept_call_common_pointer_extra_noexcept(uchar *,uint const*,int)+C↓j ...
    .text:000000000000F10C ; __unwind {
    .text:000000000000F10C                 SUBS            W8, W2, #1
    .text:000000000000F110                 B.LT            locret_F150
    .text:000000000000F114                 LSR             W8, W8, #2
    .text:000000000000F118                 ADD             W8, W8, #1
    .text:000000000000F11C                 ADD             X9, X0, #3
    .text:000000000000F120
    .text:000000000000F120 loc_F120                                ; CODE XREF: __appMD5Encode_common(uchar *,uint const*,int)+40↓j
    .text:000000000000F120                 LDR             W10, [X1]
    .text:000000000000F124                 SUBS            X8, X8, #1
    .text:000000000000F128                 STURB           W10, [X9,#-3]
    .text:000000000000F12C                 LDR             W10, [X1]
    .text:000000000000F130                 LSR             W10, W10, #8
    .text:000000000000F134                 STURB           W10, [X9,#-2]
    .text:000000000000F138                 LDRH            W10, [X1,#2]
    .text:000000000000F13C                 STURB           W10, [X9,#-1]
    .text:000000000000F140                 LDRB            W10, [X1,#3]
    .text:000000000000F144                 ADD             X1, X1, #4
    .text:000000000000F148                 STRB            W10, [X9],#4
    .text:000000000000F14C                 B.NE            loc_F120
    .text:000000000000F150
    .text:000000000000F150 locret_F150                             ; CODE XREF: __appMD5Encode_common(uchar *,uint const*,int)+4↑j
    .text:000000000000F150                 RET
    .text:000000000000F150 ; } // starts at F10C
    .text:000000000000F150 ; End of function __appMD5Encode_common(uchar *,uint const*,int)
    .text:000000000000F150
    .text:000000000000F154
    .text:000000000000F154 ; =============== S U B R O U T I N E =======================================
    .text:000000000000F154
    .text:000000000000F154
    .text:000000000000F154 ; __int64 __fastcall __appMD5Encode_noexcept(unsigned __int8 *, const unsigned int *, int)
    .text:000000000000F154                 EXPORT _Z23__appMD5Encode_noexceptPhPKji
    .text:000000000000F154 _Z23__appMD5Encode_noexceptPhPKji       ; CODE XREF: __appMD5Encode_noexcept(uchar *,uint const*,int)+C↑j
    .text:000000000000F154                                         ; appMD5Encode_noexcept_call_noexcept_pointer_extra_noexcept(uchar *,uint const*,int)+C↓j ...
    .text:000000000000F154 ; __unwind {
    .text:000000000000F154                 SUBS            W8, W2, #1
    .text:000000000000F158                 B.LT            locret_F198
    .text:000000000000F15C                 LSR             W8, W8, #2
    .text:000000000000F160                 ADD             W8, W8, #1
    .text:000000000000F164                 ADD             X9, X0, #3
    .text:000000000000F168
    .text:000000000000F168 loc_F168                                ; CODE XREF: __appMD5Encode_noexcept(uchar *,uint const*,int)+40↓j
    .text:000000000000F168                 LDR             W10, [X1]
    .text:000000000000F16C                 SUBS            X8, X8, #1
    .text:000000000000F170                 STURB           W10, [X9,#-3]
    .text:000000000000F174                 LDR             W10, [X1]
    .text:000000000000F178                 LSR             W10, W10, #8
    .text:000000000000F17C                 STURB           W10, [X9,#-2]
    .text:000000000000F180                 LDRH            W10, [X1,#2]
    .text:000000000000F184                 STURB           W10, [X9,#-1]
    .text:000000000000F188                 LDRB            W10, [X1,#3]
    .text:000000000000F18C                 ADD             X1, X1, #4
    .text:000000000000F190                 STRB            W10, [X9],#4
    .text:000000000000F194                 B.NE            loc_F168
    .text:000000000000F198
    .text:000000000000F198 locret_F198                             ; CODE XREF: __appMD5Encode_noexcept(uchar *,uint const*,int)+4↑j
    .text:000000000000F198                 RET
    .text:000000000000F198 ; } // starts at F154
    .text:000000000000F198 ; End of function __appMD5Encode_noexcept(uchar *,uint const*,int)
    .text:000000000000F198
    .text:000000000000F19C
    .text:000000000000F19C ; =============== S U B R O U T I N E =======================================
    .text:000000000000F19C
    .text:000000000000F19C
    .text:000000000000F19C ; __int64 __fastcall appMD5Encode_noexcept_call_common(unsigned __int8 *, const unsigned int *, int)
    .text:000000000000F19C                 EXPORT _Z33appMD5Encode_noexcept_call_commonPhPKji
    .text:000000000000F19C _Z33appMD5Encode_noexcept_call_commonPhPKji
    .text:000000000000F19C                                         ; DATA XREF: LOAD:0000000000003310↑o
    .text:000000000000F19C ; __unwind {
    .text:000000000000F19C                 B               ._Z21__appMD5Encode_commonPhPKji ; __appMD5Encode_common(uchar *,uint const*,int)
    .text:000000000000F19C ; } // starts at F19C
    .text:000000000000F19C ; End of function appMD5Encode_noexcept_call_common(uchar *,uint const*,int)
    .text:000000000000F19C
    .text:000000000000F1A0
    .text:000000000000F1A0 ; =============== S U B R O U T I N E =======================================
    .text:000000000000F1A0
    .text:000000000000F1A0
    .text:000000000000F1A0 ; __int64 __fastcall appMD5Encode_noexcept_call_noexcept(unsigned __int8 *, const unsigned int *, int)
    .text:000000000000F1A0                 EXPORT _Z35appMD5Encode_noexcept_call_noexceptPhPKji
    .text:000000000000F1A0 _Z35appMD5Encode_noexcept_call_noexceptPhPKji
    .text:000000000000F1A0                                         ; DATA XREF: LOAD:0000000000002650↑o
    .text:000000000000F1A0 ; __unwind {
    .text:000000000000F1A0                 B               ._Z23__appMD5Encode_noexceptPhPKji ; __appMD5Encode_noexcept(uchar *,uint const*,int)
    .text:000000000000F1A0 ; } // starts at F1A0
    .text:000000000000F1A0 ; End of function appMD5Encode_noexcept_call_noexcept(uchar *,uint const*,int)
    .text:000000000000F1A0
    .text:000000000000F1A4
    .text:000000000000F1A4 ; =============== S U B R O U T I N E =======================================
    .text:000000000000F1A4
    .text:000000000000F1A4
    .text:000000000000F1A4 ; __int64 __fastcall appMD5Encode_noexcept_call_common_pointer(unsigned __int8 *, const unsigned int *, int)
    .text:000000000000F1A4                 EXPORT _Z41appMD5Encode_noexcept_call_common_pointerPhPKji
    .text:000000000000F1A4 _Z41appMD5Encode_noexcept_call_common_pointerPhPKji
    .text:000000000000F1A4                                         ; DATA XREF: LOAD:0000000000002F98↑o
    .text:000000000000F1A4
    .text:000000000000F1A4 var_10          = -0x10
    .text:000000000000F1A4
    .text:000000000000F1A4 ; __unwind { // __gxx_personality_v0
    .text:000000000000F1A4                 STR             X30, [SP,#var_10]!
    .text:000000000000F1A8                 ADRP            X8, #g_commonFuncPtr_ptr@PAGE
    .text:000000000000F1AC                 LDR             X8, [X8,#g_commonFuncPtr_ptr@PAGEOFF]
    .text:000000000000F1B0                 LDR             X8, [X8] ; __appMD5Encode_common(uchar *,uint const*,int)
    .text:000000000000F1B4 ;   try {
    .text:000000000000F1B4                 BLR             X8
    .text:000000000000F1B4 ;   } // starts at F1B4
    .text:000000000000F1B8                 LDR             X30, [SP+0x10+var_10],#0x10
    .text:000000000000F1BC                 RET
    .text:000000000000F1C0 ; ---------------------------------------------------------------------------
    .text:000000000000F1C0 ;   catch(...) // owned by F1B4
    .text:000000000000F1C0                 BL              __clang_call_terminate
    .text:000000000000F1C0 ; } // starts at F1A4
    .text:000000000000F1C0 ; End of function appMD5Encode_noexcept_call_common_pointer(uchar *,uint const*,int)
    .text:000000000000F1C0
    .text:000000000000F1C4
    .text:000000000000F1C4 ; =============== S U B R O U T I N E =======================================
    .text:000000000000F1C4
    .text:000000000000F1C4
    .text:000000000000F1C4 ; __int64 __fastcall appMD5Encode_noexcept_call_noexcept_pointer(unsigned __int8 *, const unsigned int *, int)
    .text:000000000000F1C4                 EXPORT _Z43appMD5Encode_noexcept_call_noexcept_pointerPhPKji
    .text:000000000000F1C4 _Z43appMD5Encode_noexcept_call_noexcept_pointerPhPKji
    .text:000000000000F1C4                                         ; DATA XREF: LOAD:0000000000003C40↑o
    .text:000000000000F1C4
    .text:000000000000F1C4 var_10          = -0x10
    .text:000000000000F1C4
    .text:000000000000F1C4 ; __unwind { // __gxx_personality_v0
    .text:000000000000F1C4                 STR             X30, [SP,#var_10]!
    .text:000000000000F1C8                 ADRP            X8, #g_noexceptFuncPtr_ptr@PAGE
    .text:000000000000F1CC                 LDR             X8, [X8,#g_noexceptFuncPtr_ptr@PAGEOFF]
    .text:000000000000F1D0                 LDR             X8, [X8] ; __appMD5Encode_noexcept(uchar *,uint const*,int)
    .text:000000000000F1D4 ;   try {
    .text:000000000000F1D4                 BLR             X8
    .text:000000000000F1D4 ;   } // starts at F1D4
    .text:000000000000F1D8                 LDR             X30, [SP+0x10+var_10],#0x10
    .text:000000000000F1DC                 RET
    .text:000000000000F1E0 ; ---------------------------------------------------------------------------
    .text:000000000000F1E0 ;   catch(...) // owned by F1D4
    .text:000000000000F1E0                 BL              __clang_call_terminate
    .text:000000000000F1E0 ; } // starts at F1C4
    .text:000000000000F1E0 ; End of function appMD5Encode_noexcept_call_noexcept_pointer(uchar *,uint const*,int)
    .text:000000000000F1E0
    .text:000000000000F1E4
    .text:000000000000F1E4 ; =============== S U B R O U T I N E =======================================
    .text:000000000000F1E4
    .text:000000000000F1E4
    .text:000000000000F1E4 ; __int64 __fastcall appMD5Encode_noexcept_call_common_pointer_extra_noexcept(unsigned __int8 *, const unsigned int *, int)
    .text:000000000000F1E4                 EXPORT _Z56appMD5Encode_noexcept_call_common_pointer_extra_noexceptPhPKji
    .text:000000000000F1E4 _Z56appMD5Encode_noexcept_call_common_pointer_extra_noexceptPhPKji
    .text:000000000000F1E4                                         ; DATA XREF: LOAD:0000000000002AA0↑o
    .text:000000000000F1E4 ; __unwind {
    .text:000000000000F1E4                 ADRP            X8, #g_commonFuncPtr_ptr@PAGE
    .text:000000000000F1E8                 LDR             X8, [X8,#g_commonFuncPtr_ptr@PAGEOFF]
    .text:000000000000F1EC                 LDR             X3, [X8] ; __appMD5Encode_common(uchar *,uint const*,int)
    .text:000000000000F1F0                 BR              X3      ; __appMD5Encode_common(uchar *,uint const*,int)
    .text:000000000000F1F0 ; } // starts at F1E4
    .text:000000000000F1F0 ; End of function appMD5Encode_noexcept_call_common_pointer_extra_noexcept(uchar *,uint const*,int)
    .text:000000000000F1F0
    .text:000000000000F1F4
    .text:000000000000F1F4 ; =============== S U B R O U T I N E =======================================
    .text:000000000000F1F4
    .text:000000000000F1F4
    .text:000000000000F1F4 ; __int64 __fastcall appMD5Encode_noexcept_call_noexcept_pointer_extra_noexcept(unsigned __int8 *, const unsigned int *, int)
    .text:000000000000F1F4                 EXPORT _Z58appMD5Encode_noexcept_call_noexcept_pointer_extra_noexceptPhPKji
    .text:000000000000F1F4 _Z58appMD5Encode_noexcept_call_noexcept_pointer_extra_noexceptPhPKji
    .text:000000000000F1F4                                         ; DATA XREF: LOAD:00000000000024D0↑o
    .text:000000000000F1F4 ; __unwind {
    .text:000000000000F1F4                 ADRP            X8, #g_noexceptFuncPtr_ptr@PAGE
    .text:000000000000F1F8                 LDR             X8, [X8,#g_noexceptFuncPtr_ptr@PAGEOFF]
    .text:000000000000F1FC                 LDR             X3, [X8] ; __appMD5Encode_noexcept(uchar *,uint const*,int)
    .text:000000000000F200                 BR              X3      ; __appMD5Encode_noexcept(uchar *,uint const*,int)
    .text:000000000000F200 ; } // starts at F1F4
    .text:000000000000F200 ; End of function appMD5Encode_noexcept_call_noexcept_pointer_extra_noexcept(uchar *,uint const*,int)
    .text:000000000000F200
    .text:000000000000F204
    .text:000000000000F204 ; =============== S U B R O U T I N E =======================================
    .text:000000000000F204
    .text:000000000000F204
    .text:000000000000F204 ; __int64 __fastcall appMD5Encode_common_call_common(unsigned __int8 *, const unsigned int *, int)
    .text:000000000000F204                 EXPORT _Z31appMD5Encode_common_call_commonPhPKji
    .text:000000000000F204 _Z31appMD5Encode_common_call_commonPhPKji
    .text:000000000000F204                                         ; DATA XREF: LOAD:0000000000002EA8↑o
    .text:000000000000F204 ; __unwind {
    .text:000000000000F204                 B               ._Z21__appMD5Encode_commonPhPKji ; __appMD5Encode_common(uchar *,uint const*,int)
    .text:000000000000F204 ; } // starts at F204
    .text:000000000000F204 ; End of function appMD5Encode_common_call_common(uchar *,uint const*,int)
    .text:000000000000F204
    .text:000000000000F208
    .text:000000000000F208 ; =============== S U B R O U T I N E =======================================
    .text:000000000000F208
    .text:000000000000F208
    .text:000000000000F208 ; __int64 __fastcall appMD5Encode_common_call_noexcept(unsigned __int8 *, const unsigned int *, int)
    .text:000000000000F208                 EXPORT _Z33appMD5Encode_common_call_noexceptPhPKji
    .text:000000000000F208 _Z33appMD5Encode_common_call_noexceptPhPKji
    .text:000000000000F208                                         ; DATA XREF: LOAD:0000000000002320↑o
    .text:000000000000F208 ; __unwind {
    .text:000000000000F208                 B               ._Z23__appMD5Encode_noexceptPhPKji ; __appMD5Encode_noexcept(uchar *,uint const*,int)
    .text:000000000000F208 ; } // starts at F208
    .text:000000000000F208 ; End of function appMD5Encode_common_call_noexcept(uchar *,uint const*,int)
    .text:000000000000F208
    .text:000000000000F20C
    .text:000000000000F20C ; =============== S U B R O U T I N E =======================================
    .text:000000000000F20C
    .text:000000000000F20C
    .text:000000000000F20C ; __int64 __fastcall appMD5Encode_common_call_common_pointer(unsigned __int8 *, const unsigned int *, int)
    .text:000000000000F20C                 EXPORT _Z39appMD5Encode_common_call_common_pointerPhPKji
    .text:000000000000F20C _Z39appMD5Encode_common_call_common_pointerPhPKji
    .text:000000000000F20C                                         ; DATA XREF: LOAD:0000000000002230↑o
    .text:000000000000F20C ; __unwind {
    .text:000000000000F20C                 ADRP            X8, #g_commonFuncPtr_ptr@PAGE
    .text:000000000000F210                 LDR             X8, [X8,#g_commonFuncPtr_ptr@PAGEOFF]
    .text:000000000000F214                 LDR             X3, [X8] ; __appMD5Encode_common(uchar *,uint const*,int)
    .text:000000000000F218                 BR              X3      ; __appMD5Encode_common(uchar *,uint const*,int)
    .text:000000000000F218 ; } // starts at F20C
    .text:000000000000F218 ; End of function appMD5Encode_common_call_common_pointer(uchar *,uint const*,int)
    .text:000000000000F218
    .text:000000000000F21C
    .text:000000000000F21C ; =============== S U B R O U T I N E =======================================
    .text:000000000000F21C
    .text:000000000000F21C
    .text:000000000000F21C ; __int64 __fastcall appMD5Encode_common_call_noexcept_pointer(unsigned __int8 *, const unsigned int *, int)
    .text:000000000000F21C                 EXPORT _Z41appMD5Encode_common_call_noexcept_pointerPhPKji
    .text:000000000000F21C _Z41appMD5Encode_common_call_noexcept_pointerPhPKji
    .text:000000000000F21C                                         ; DATA XREF: LOAD:0000000000002D10↑o
    .text:000000000000F21C ; __unwind {
    .text:000000000000F21C                 ADRP            X8, #g_noexceptFuncPtr_ptr@PAGE
    .text:000000000000F220                 LDR             X8, [X8,#g_noexceptFuncPtr_ptr@PAGEOFF]
    .text:000000000000F224                 LDR             X3, [X8] ; __appMD5Encode_noexcept(uchar *,uint const*,int)
    .text:000000000000F228                 BR              X3      ; __appMD5Encode_noexcept(uchar *,uint const*,int)
    .text:000000000000F228 ; } // starts at F21C
    .text:000000000000F228 ; End of function appMD5Encode_common_call_noexcept_pointer(uchar *,uint const*,int)
    .text:000000000000F228
    .text:000000000000F22C
    .text:000000000000F22C ; =============== S U B R O U T I N E =======================================
    .text:000000000000F22C
    .text:000000000000F22C
    .text:000000000000F22C ; __int64 __fastcall appMD5Encode_common_call_common_pointer_extra_noexcept(unsigned __int8 *, const unsigned int *, int)
    .text:000000000000F22C                 EXPORT _Z54appMD5Encode_common_call_common_pointer_extra_noexceptPhPKji
    .text:000000000000F22C _Z54appMD5Encode_common_call_common_pointer_extra_noexceptPhPKji
    .text:000000000000F22C                                         ; DATA XREF: LOAD:0000000000002620↑o
    .text:000000000000F22C ; __unwind {
    .text:000000000000F22C                 ADRP            X8, #g_commonFuncPtr_ptr@PAGE
    .text:000000000000F230                 LDR             X8, [X8,#g_commonFuncPtr_ptr@PAGEOFF]
    .text:000000000000F234                 LDR             X3, [X8] ; __appMD5Encode_common(uchar *,uint const*,int)
    .text:000000000000F238                 BR              X3      ; __appMD5Encode_common(uchar *,uint const*,int)
    .text:000000000000F238 ; } // starts at F22C
    .text:000000000000F238 ; End of function appMD5Encode_common_call_common_pointer_extra_noexcept(uchar *,uint const*,int)
    .text:000000000000F238
    .text:000000000000F23C
    .text:000000000000F23C ; =============== S U B R O U T I N E =======================================
    .text:000000000000F23C
    .text:000000000000F23C
    .text:000000000000F23C ; __int64 __fastcall appMD5Encode_common_call_noexcept_pointer_extra_noexcept(unsigned __int8 *, const unsigned int *, int)
    .text:000000000000F23C                 EXPORT _Z56appMD5Encode_common_call_noexcept_pointer_extra_noexceptPhPKji
    .text:000000000000F23C _Z56appMD5Encode_common_call_noexcept_pointer_extra_noexceptPhPKji
    .text:000000000000F23C                                         ; DATA XREF: LOAD:0000000000001EB8↑o
    .text:000000000000F23C ; __unwind {
    .text:000000000000F23C                 ADRP            X8, #g_noexceptFuncPtr_ptr@PAGE
    .text:000000000000F240                 LDR             X8, [X8,#g_noexceptFuncPtr_ptr@PAGEOFF]
    .text:000000000000F244                 LDR             X3, [X8] ; __appMD5Encode_noexcept(uchar *,uint const*,int)
    .text:000000000000F248                 BR              X3      ; __appMD5Encode_noexcept(uchar *,uint const*,int)
    .text:000000000000F248 ; } // starts at F23C
    .text:000000000000F248 ; End of function appMD5Encode_common_call_noexcept_pointer_extra_noexcept(uchar *,uint const*,int)
    .text:000000000000F248

         当使用noexcept的函数调用普通函数时并没有什么问题,如果在noexcept的函数中调用普通的函数指针,那么编译器会安插一些额外的指令来确保noexcept函数中抛出异常时执行terminate操作。所以,此时需要将函数指针也标记成noexcept,那么它将按照常规的方式来调用目标函数指针了。

    ((void (*)(uint8*, const uint32*, int) noexcept)g_noexceptFuncPtr)(output, input, len);

         如上所示。

  • 相关阅读:
    第十七讲:解释器模式
    第十六讲:适配器模式
    第十五讲:桥接模式
    第十四讲:组合模式
    第十三讲:外观模式
    第十二讲:代理模式
    第十一讲:享元模式
    第九讲:策略模式
    工厂模式
    观察者设计模式
  • 原文地址:https://www.cnblogs.com/bodong/p/16262904.html
Copyright © 2020-2023  润新知