在考察下面的功能的拆卸,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