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如果您使用调试器单独设置到它中[并且您启用了调试符号],它应该为您提供源代码。