我知道实现者可以选择是否要将malloc页面归零,还是让OS给他一个归零页面(为了更多优化目的)。
我的问题很简单 - 在Ubuntu 14.04 LTS中附带了linux内核3.16和gcc 4.8.4,谁会将我的页面归零?是用户土地还是内核土地?
答案 0 :(得分:2)
它可以取决于记忆的来源。 var foo = function foo(args) {
this.stuff = function() {
return args
}
this.do = this;
return this
}
console.log(foo("bar").do.stuff())
代码是userland,并且将归零由进程重用的内存页面。当先前使用并释放内存但未返回到操作系统时,会发生这种情况。但是,如果页面是新分配给进程的,则操作系统已将其清除为0(出于安全目的),因此不需要由calloc
清除。这意味着calloc
可能比调用calloc
后跟malloc
更快,因为如果知道它已经归零,它可以跳过memset
。
答案 1 :(得分:1)
这取决于标准库的实现者,而不是主机系统。无法为特定操作系统提供具体答案,因为它可能是多个编译器及其库的构建目标 - 包括在其他系统上,如果您考虑交叉编译的可能性(构建在一种类型的系统上)目标另一个)。
我见过var formatted = dt.ToString("yyyy-MM-dd");
的大部分实现都使用calloc()
调用,然后调用malloc()
或(对某些实现以unix为目标)调用遗留函数memset()
- 它本身有时会被一个宏调用所取代,该调用会在许多最新版本的库中扩展为bzero()
的调用。
memset()
通常是手动优化的。但是,再次,它取决于图书馆的实施者。