ソースコード
#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を起動できるようになる。