C++ 是否可以使用C/C++;编译器内联内置函数,如malloc()?
在检查以下功能的拆卸时C++ 是否可以使用C/C++;编译器内联内置函数,如malloc()?,c++,disassembly,built-in,C++,Disassembly,Built In,在检查以下功能的拆卸时 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&
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
;第26行
LN4美元:
推送rbx
副rsp,32;000000 20小时
; 第29行
mov-ecx,160;000000 a0h
mov rbx,r8
调用QWORD PTR\uu imp\u malloc允许C编译器内联malloc
(或者,正如您在示例中看到的,它的一部分),但不需要内联任何内容。它使用的启发式方法不需要文档化,而且通常非常复杂,但通常只会内联短函数,因为否则代码可能会膨胀。malloc
和friends都是在运行库中实现的,因此它们不可用于内联。要实现这一点,它们需要在头文件中包含它们的实现
如果您想查看它们的反汇编,可以使用调试器进入它们。或者,根据您使用的编译器和运行时,源代码可能是可用的。例如,它同时适用于gcc和msvc。阻止malloc()
等的内联的主要原因是它们的复杂性,而且显然没有提供函数的内联定义。此外,您可能需要在不同时间使用不同版本的函数;像valgrind
这样的工具将更难(messier)工作,并且如果函数的代码是内联展开的,您无法安排使用调试版本的函数。通常编译器在编译期间有可用的源代码时会内联函数(换句话说,函数是在头文件中定义的,而不仅仅是一个原型声明)
但是,在本例中,函数(malloc
)位于DLL中,因此在编译代码期间,编译器显然无法使用源代码。它与malloc
所做的事情无关(等等)。然而,malloc
也可能不会被内联,因为它是一个相当大的函数[至少经常是这样],所以即使源代码可用,它也不会被内联
如果您使用的是VisualStudio,几乎可以肯定地找到运行库的源代码,因为它是随VisualStudio包提供的
(C运行时函数位于DLL中,因为系统中的许多不同程序使用相同的函数,所以将它们放入一个DLL中,为所有“用户”加载一次)对该功能的优化可以很好地节省系统中所有代码的大小。虽然malloc可能只有几百个字节,但像printf
这样的函数可以很容易地将可执行文件的大小增加5-25KB。将其乘以“用户”数当然,所有其他功能,如fopen
,fclose
,malloc
,calloc
,free
,等等,都会增加一点总大小)谁禁止?该标准本身并不关心这些实现细节。由编译器编写。如何使它们内联?如果只有一个调用方,或者如果被调用函数的复杂度小于调用本身的复杂度,则内联最为有益<代码>malloc
在这两个方面几乎都处于规模的另一端。好的,我有使用malloc的函数包的dll。如何打开dll查看配料?例如:第135行:malloc_在这里开始,第1040行:结束malloc如果您使用调试器单独设置到它中[并且您启用了调试符号],它应该为您提供源代码。