解析操作系统的内存分配(malloc)对齐策略2015-05-03问题:我们在写程序的时候经常发现程序使用的内存往往比我们申请的多,为了优化程序的内存占用,搅尽脑汁想要优化内存占用,可是发现自己的代码也无从优化了,怎么办?现在我们把我们的焦点放到malloc上,毕竟我们向系统申请的内存都是通过它完成了,不了解他,也就不能彻底的优化内存占用。来个小例子
//g++ -o malloc_addr_vecmallc_addr_vec.cpp 编译#include<iostream>using namespace std;int main(int argc, char *argv[]){int malloc_size = atoi(argv[1]);char * malloc_char;for (size_t i = 0; i < 1024*1024; ++i) {malloc_char = new char[malloc_size];}while (1) {}//此时查看内存占用return 0;}
本文的测试环境为Linux 64Bit ,使用G++编译为可执行文件后,使用不同的启动参数启动,使用top命令查看程序占用的内存,这里我们主要是看RES指标RES -- Resident size (kb)The non-swapped physical memory a task has used.测试案例:1.每次new 1 Byte Do 1024*1024次./malloc_addr_vec 1启动程序后的内存占用

内存消耗 32MB2.每次new 24 Byte Do 1024*1024次./malloc_addr_vec 24启动程序后的内存占用

内存消耗32MB3.每次new 25 Byte Do 1024*1024次./malloc_addr_vec 25启动程序后的内存占用

内存消耗48MB为什么我们每次new 1Byte 和每次 new 24Byte系统消耗的内存一样呢?,为什么每次new 25Byte和 每次new 24Byte占用的内存完全不同呢?不知道大家在写程序的时候有没有关注过这个问题。我一次遇到时,吐槽一句:What the fuck malloc.