progtips

mexpander

最終更新:

progtips

- view
メンバー限定 登録/ログイン

ソースコード

#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&lt:char*> mem(mb);
		for (int i=0; i&lt: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&lt: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を起動できるようになる。
記事メニュー
目安箱バナー