[英]calloc() slower than malloc() & memset()
我想問你一個問題。 我有以下代碼:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define XXX 1024*1024
int main()
{
int *p;
unsigned long x=0;
while (1)
{
//p = (int *) calloc (1,XXX);
p = (int *) malloc (XXX);
memset (p,0,XXX);
x++;
printf ("%lu MB allocated.\n",x);
sleep (1);
}
return 0;
}
如果我運行此代碼,一切都正常運行。 每秒,在內存中分配一個新的MB。 我遇到的問題是如果我取消注釋calloc()行並注釋malloc()和memset()行。 據我所知,calloc()應該在分配的內存中將所有字節初始化為零; 與malloc()和memset()相同的事情。
當我使用calloc()(沒有malloc()和memset())運行代碼時,分配初始1 MB(正常),然后在幾秒(~10)之后分配另一個MB。
為什么會這樣?
提前致謝!
據我所知,calloc()應該在分配的內存中將所有字節初始化為零。
基於我對calloc
調用的理解,這部分是正確的。
它保留空間但不會將所有內存初始化為零。 它通常或通常將一個部分初始化為零,並將所有其他部分指向該部分; 當在此塊中修改或訪問內存時,它將在使用前將其初始化為零。 這意味着非常大的calloc
調用不會將所有內存多次設置為零,而是僅在實際需要時才設置。
tl; dr :這是一個OS理論技巧,內核會作弊。 這里有一個更長的描述: https : //stackoverflow.com/a/2688522/2441252 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.