1) MMGR线程安全吗?
2)我希望有人能帮我理解一些代码。我在看一些使用宏的东西,但是我不理解这个宏。我知道它包含一个函数调用和一个if检查,然而,这个函数是一个空函数。包装(m_setOwner(,_LINE_,Functional),false)“如何更改返回类型?”
#define someMacro (m_setOwner(__FILE__,__LINE__,__FUNCTION__),false) ? NULL : new ...
void m_setOwner(const char *file, const unsigned int line, const char *func);3)水库的意义是什么?
4)在第770行("void *operator new(size_t reportedSize)“”有一行"// ANSI说:0字节的分配请求仍将返回一个有效值“
在这种情况下,ANSI是谁/什么?他们是指标准吗?
5)这是更多的C++标准,但是"reportedSize“从何而来?"void *operator new(size_t reportedSize)"?
6)这是实际执行所需分配的代码吗?"au->actualAddress = malloc(au->actualSize);“
发布于 2011-02-24 19:32:44
1) C++03标准没有提到线程。但是,在所有支持线程的平台中,默认内存分配程序(new和delete)都是线程安全的。
编辑:一般情况下,如果事情没有被标记为线程安全,那么您应该假设它们不安全,特别是当存在隐式全局数据时(例如内存管理器中的堆管理结构)。我读过一些关于MMGR库的对另一个论坛的评论,不是是线程安全的。
2)宏中的逗号运算符丢弃左边的结果,因此(m_setOwner(...), false)表达式的结果总是false。
编辑:在中使用这个语法来记录内存分配,然后再进行真正的分配。使用逗号运算符使new宏语法保持不变。预处理宏是一种简单的基于文本的查找和替换机制.代码中对new的任何使用都将使用这个MMGR库进行编译。正因为如此,当使用MMGR时,内存分配将被记录下来,这对于调试非常有用!
3)什么“水库”?你指的是堆吗?这学期你从哪里学来的?
编辑:应用程序级的内存管理器只是系统级内存管理器的前端。因此,它必须要求系统分配大内存页。在这种情况下,库似乎是预先分配一些大页面的机制的名称,从而保证了接下来的几个分配成功。这主要是一种优化,因为您将单个(昂贵)系统级分配的成本分摊到多个应用程序级别的分配中。
4)是的,在这方面,"ANSI“指的是C++03标准。现在引用它的正确方法是使用ISO标准编号。随便搜索一下吧。
5)报告的大小由编译器设置。当您编写类似于X* x = new X(...);的东西时,编译器在逻辑上“重写”它到等效的表单:
X* x = static_cast<X*>(operator new(sizeof(X)));
new(x) X(...);第一行分配足够的内存(sizeof(X)是作为reportedSize参数传递给operator new的值)。第二行调用X类的构造函数,以便在分配的内存槽中创建对象。
6)参见#5。是的,虽然您的平台可能不会在“发布”模式下在malloc()中调用operator new,但可以在这些临时时间内考虑它。
https://stackoverflow.com/questions/5109273
复制相似问题