在考察下面的功能的拆卸,C/C++編譯器可以內聯malloc()內聯函數嗎?
void * malloc_float_align(size_t n, unsigned int a, float *& dizi)
{
void * adres=NULL;
void * adres2=NULL;
adres=malloc(n*sizeof(float)+a);
size_t adr=(size_t)adres;
size_t adr2=adr+a-(adr&(a-1u));
adres2=(void *) adr2;
dizi=(float *)adres2;
return adres;
}
內置函數甚至不與inline
優化標誌集內聯。
; Line 26
$LN4:
push rbx
sub rsp, 32 ; 00000020H
; Line 29
mov ecx, 160 ; 000000a0H
mov rbx, r8
call QWORD PTR __imp_malloc <------this is not inlined
; Line 31
mov rcx, rax
; Line 33
mov rdx, rax
and ecx, 31
sub rdx, rcx
add rdx, 32 ; 00000020H
mov QWORD PTR [rbx], rdx
; Line 35
add rsp, 32 ; 00000020H
pop rbx
ret 0
問:這是一個必須具備的功能特性就像malloc
?我們可以通過某種方式來檢查它(或者像strcmp/new/free/delete之類的其他函數)嗎?這是禁止的嗎?
被誰禁止?該標準不涉及這些實施細節。 – delnan
由編譯器。我怎樣才能讓他們內聯? –
如果只有一個調用者,或者被調用函數的複雜度小於調用本身的複雜度,則內聯是最有益的。 'malloc'幾乎與這個尺度的兩端相反。 – MSalters