windows下C++内存碎片的测试

环境:windows10 + visual studio.net 2019

硬件:4G内存

背景:之前的博客(https://blog.csdn.net/wingnet/article/details/99688035)提到了堆内存中内存碎片的问题,今天专门做个测试,看看是否如理论分析。

大容量对象和小容量对象轮流申请内存,然后释放所有小容量对象,按照之前的分析,应该无法再为大对象分配内存。

代码如下:

这段代码是 只给大对象分配内存,看看最多能创建多少个大对象。

#include <iostream>
#include <vector>
#include "ConsoleApplication1.h"

class TestBig {
	int buf[1024*1024];
};

class TestSmall {
	int buf[512*1024];
};

std::vector<TestBig*> vBig;
std::vector<TestSmall*> vSmall;

int main()
{
	double dM = 1024.0 * 1024.0;

	std::cout << "int size(byte) : " << sizeof(int) << "\n";
	std::cout << "TestBig size(byte) : " << sizeof(TestBig) << "    size(M) : "<< sizeof(TestBig) /dM <<"\n";
	std::cout << "TestSmall size(byte) : " << sizeof(TestSmall) << "    size(M) : " << sizeof(TestSmall) / dM << "\n";

	for (long i = 0; i < 1024*1024; i++) {
		try {

			vBig.push_back(new TestBig());


		}
		catch(std::exception &ex){
			std::cout << "--- " << ex.what() << " --- \n";
			
			PrintSize();

			break;
		}
		
	}



}

void PrintSize()
{
	double dG = 1024.0 * 1024 * 1024.0;
	std::cout << "big vector size : " << vBig.size()<< " size(G) : "<< 1.0*vBig.size()*sizeof(TestBig)/dG << "\n";
	std::cout << "small vector size : " << vSmall.size() << " size(G) : " << 1.0*vSmall.size() * sizeof(TestSmall) / dG << "\n";
	std::cout << "------\n";
}

下面的图片是x86的运行结果,可以看出,最多分配了1.93G:

下图是x64的运行结果,可以看出,最多分配了8.39G:

 

下面的代码进行了大对象和小对象轮换申请内存:

#include <iostream>
#include <vector>
#include "ConsoleApplication1.h"

class TestBig {
	int buf[1024*1024];
};

class TestSmall {
	int buf[512*1024];
};

std::vector<TestBig*> vBig;
std::vector<TestSmall*> vSmall;

int main()
{
	double dM = 1024.0 * 1024.0;

	std::cout << "int size(byte) : " << sizeof(int) << "\n";
	std::cout << "TestBig size(byte) : " << sizeof(TestBig) << "    size(M) : "<< sizeof(TestBig) /dM <<"\n";
	std::cout << "TestSmall size(byte) : " << sizeof(TestSmall) << "    size(M) : " << sizeof(TestSmall) / dM << "\n";

	for (long i = 0; i < 1024*1024; i++) {
		try {

			vBig.push_back(new TestBig());
			vSmall.push_back(new TestSmall());

		}
		catch(std::exception &ex){
			std::cout << "--- " << ex.what() << " --- \n";
			
			PrintSize();

			break;
		}
		
	}

	for (int i = 0; i < vSmall.size(); i++) {
		delete vSmall[i];
	}
	vSmall.clear();

	std::cout << "--- after delete vSmall vector : ---\n";
	PrintSize();

	for (int i = 0; i < 1024; i++) {
		try {
			vBig.push_back(new TestBig());
		}
		catch (std::exception ex) {
			std::cout << "--- " << ex.what() << " --- \n";

			PrintSize();

			break;
		}
	}


}

void PrintSize()
{
	double dG = 1024.0 * 1024 * 1024.0;
	std::cout << "big vector size : " << vBig.size()<< " size(G) : "<< 1.0*vBig.size()*sizeof(TestBig)/dG << "\n";
	std::cout << "small vector size : " << vSmall.size() << " size(G) : " << 1.0*vSmall.size() * sizeof(TestSmall) / dG << "\n";
	std::cout << "------\n";
}

x86下的结果,确实如理论所预测,即使小对象的内存都被释放了,但是还是无法充分利用释放出来的空间创建大对象:

 

x64下的结果,似乎跟理论不太吻合,需要进一步分析:

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值