C++:删除与免费和性能

use*_*522 26 c++ performance pointers

  1. 考虑:

    char *p=NULL;
    free(p) // or
    delete p;
    
    Run Code Online (Sandbox Code Playgroud)

    如果我使用freedelete开启会发生什么p

  2. 如果程序需要很长时间才能执行,比如10分钟,有没有办法将其运行时间减少到5分钟?

str*_*ger 61

关于new/delete和malloc/free的一些性能说明:

malloc和free 分别调用构造函数和解构函数.这意味着你的课程不会被自动化或自动取消初始化,这可能是不好的(例如未经执行的指针)!这对于像char和double这样的POD数据类型无关紧要,因为它们实际上没有ctor.

new和delete 调用构造函数和解构函数.这意味着您的类实例会被初始化并自动取消初始化.但是,通常会出现性能损失(与普通分配相比),但这样做会更好.

我建议保持与new/malloc使用一致,除非你有理由(例如realloc).这样,您可以减少依赖关系,减少代码大小和加载时间(但只能通过smidgin).此外,你不会因为使用new分配的东西,或删除使用malloc分配的内容而陷入困境.(这很可能会导致崩溃!)


act*_*.se 13

答1:两者free(p)delete p用NULL指针正常工作.

答案2:没有看到代码的缓慢部分就无法回答.你应该分析代码!如果您使用的是Linux,我建议使用Callgrind(Valgrind的一部分)来查找执行的哪些部分花费的时间最多.


cic*_*cic 10

问题一:什么都不会发生.

从目前的ISO/IEC 14882(或:C++)草案:

20.8.15 C库[c.malloc]

内容[of <cstdlib>,即:where freelives,]与标准C库[(参见intro.refs)]标题相同<stdlib.h>,并带有以下更改:[不会影响此答案].

因此,从ISO/IEC 9899:1999(或:C):

7.20.3.2 free功能

如果[[]] ptr[参数]是空指针,则不执行任何操作.

再次从C++标准,有关delete此时间的信息:

3.7.4.2释放函数[basic.stc.dynamic.deallocation]

提供给解除分配函数的第一个参数的值可以是空指针值; 如果是这样,并且如果解除分配功能是标准库中提供的功能,则该调用无效.

也可以看看: