ソースコード
#include <cstdio>
#include <vector>
#include <cstdlib>
void bar(const char* text, int x, int y)
{
printf("\r%12s : ", text);
const int n = 40;
for (int i=0; i<n; ++i)
{
printf("%c", (i<=(x+1)*n/y) ? 'o' : '.');
}
printf(" %3d%%", 100*(x+1)/y);
}
int main(int argc, const char** argv)
{
if (argc<2)
{
puts("mexpander <mega-bytes>");
}
else
{
const int mb = atoi(argv[1]);
printf("allocate %d mega-bytes\n", mb);
std::vector<:char*> mem(mb);
for (int i=0; i<:mb; ++i)
{
mem[i] = new char[1024*1024];
bar("allocate", i, mb);
}
printf("\n");
/* シーケンシャル */
for (int i=0; i<mb; ++i)
{
for (int j=0; j<1024*1024; j+=16)
{
mem[i][j] = (char)(i^j);
}
bar("sequensial", i, mb);
}
printf("\n");
/* ランダムアクセス */
for (int i=0; i<:100; ++i)
{
unsigned int addr = 0;
for (int j=0; j<256; ++j)
{
mem[rand()%mb][(addr>>4)%(1024*1024)] = (char)i;
addr += 0x51269793 + j;
}
bar("random", i, 100);
}
printf("\n");
/* 開放 */
for (int i=0; i<mb; ++i)
{
delete[] mem[i];
bar("free", i, mb);
}
printf("\n");
}
return 0;
}
解説
new[]した時点では、物理メモリーに割り当てられている保障がない。そのため、シーケンシャルアクセスをして仮想メモリーを物理メモリーに割り当てている。16バイト単位ぐらいでよいと思う。現在400MB空いていて、440MB確保した場合、401MB~440MBのアクセスのところで、Windowsがシステムキャッシュを吐き出していく。
たくさんのメモリーを確保している場合、最初に割り当てたところがスワップされる可能性があるので、念のため、ランダムアクセスを交えている。
こうして確保しておくと、512MBメモリーのマシンでも、400MB確保したりして、VirtualPCを起動できるようになる。