malloc中 heap block 的 blocksize 大小问题

heap block 引发的思考

问题背景:

Implicit Free Lists

Any practical allocator needs some data structure that allows it to distinguish block boundaries and to distinguish between allocated and free blocks. Most allocators embed this information in the blocks themselves.
One simple approach is shown in Figure 9.35.

malloc函数第一次申请出的是payload区域顶端的内存区域,返回的指针指向该处。

在payload之前还有一个header的区域,这个区域记录了block size,这里作者有点误导,由于是8byte align

于是在只有最底位(图中的a,用来记录block是否已经allocated还是free)

首先要理解malloc中block size的原理

这个问题要能搞定,填对,不然下面的demo看了没用。。。

这是在32bit的机器上

对于上面那个题目的题解:

This problem touches on some core ideas such as alignment requirements, minimum block sizes, and header encodings. The general approach for determining the block size is to round the sum of the requested payload
and the header size to the nearest multiple of the alignment requirement (in this case 8 bytes). For

example, the block size for the malloc(1) request is 4 + 1 = 5 rounded up to 8. The block size for the malloc(13)request is 13 + 4 = 17 rounded up to 24.

Request        Block size (decimal bytes) Block header (hex)

malloc(1)                   8                                          0x9

malloc(5)                  16                                         0x11

malloc(12)                16                                         0x11

malloc(13)                24                                         0x19

64bit的机器的malloc采用的是16byte对齐的!

在linux 64bit的 Ubuntu上做测试:

malloc(42)

这里申请 42byte的空间,malloc返回的连续内存空间是 64byte的

42 byte,由于开始有8byte的block size 区域,

42+8 = 50;

由于16byte对齐,于是对齐到64byte

至于最后的temp == 65 ,那是因为最后一位是用来提示该内存区域是否allocated。由于该bit 位等于1,于是,是allocated

上述测试代码:

/***********************************************************
code writer : EOF
code date : 2014.07.27
e-mail:[email protected]

code purpose:
	Find out what beyond the payload location. :)

************************************************************/
#include <stdio.h>
#include <stdlib.h>

#define MACHINE_ADDRESS_LENGTH 64

void print_dec2bin(int dec_number)
//Just a simple function which translate decimal number into binary numebr
{
	int temp = 0;

	int to_be_print = 0;

	int array[MACHINE_ADDRESS_LENGTH];

	for(temp = 0;temp <  MACHINE_ADDRESS_LENGTH; temp++)
	{
		array[MACHINE_ADDRESS_LENGTH-temp-1] = dec_number%2;
		dec_number >>=1;
	}	

	for(temp = 0;temp <  MACHINE_ADDRESS_LENGTH; temp++)
	{
		printf("%d",array[temp]);
	}	

	printf("\n");
}

int main()
{
	int *ptr = NULL;

	int temp = 42;//how many bytes to be allocated

	printf("byte to be allocated, temp : %d\n",temp);

	ptr = (int *)malloc(temp);

	if(ptr == NULL)
	{
		printf("malloc failed\n");
		return 0;
	}
	else
	{
		*ptr = 2014;//just write some data into payload location.
	}

	temp = *(ptr - 2);//You may never forget that this code must be run on 64-bits machine, and ptr point to 'int'!!!Attention!!
			// otherwise you have to change 'ptr-2' into 'ptr-1'

	print_dec2bin(temp);

	printf("temp : %d\n",temp);

	free(ptr);
	return 0;
}

再三提示那个ptr-2!

malloc中 heap block 的 blocksize 大小问题,布布扣,bubuko.com

时间: 2024-10-05 04:44:45

malloc中 heap block 的 blocksize 大小问题的相关文章

Objective-C中的Block

1.相关概念 在这篇笔记开始之前,我们需要对以下概念有所了解. 1.1 操作系统中的栈和堆 注:这里所说的堆和栈与数据结构中的堆和栈不是一回事. 我们先来看看一个由C/C++/OBJC编译的程序占用内存分布的结构: 栈区(stack):由系统自动分配,一般存放函数参数值.局部变量的值等.由编译器自动创建与释放.其操作方式类似于数据结构中的栈,即后进先出.先进后出的原则. 例如:在函数中申明一个局部变量int b;系统自动在栈中为b开辟空间. 堆区(heap):一般由程序员申请并指明大小,最终也由

Objective-C中的Block[转]

1.相关概念 在这篇笔记开始之前,我们需要对以下概念有所了解. 1.1 操作系统中的栈和堆 注:这里所说的堆和栈与数据结构中的堆和栈不是一回事. 我们先来看看一个由C/C++/OBJC编译的程序占用内存分布的结构: 栈区(stack):由系统自动分配,一般存放函数参数值.局部变量的值等.由编译器自动创建与释放.其操作方式类似于数据结构中的栈,即后进先出.先进后出的原则. 例如:在函数中申明一个局部变量int b;系统自动在栈中为b开辟空间. 堆区(heap):一般由程序员申请并指明大小,最终也由

Hdfs block数据块大小的设置规则

1.概述 hadoop集群中文件的存储都是以块的形式存储在hdfs中. 2.默认值 从2.7.3版本开始block size的默认大小为128M,之前版本的默认值是64M. 3.如何修改block块的大小? 可以通过修改hdfs-site.xml文件中的dfs.blocksize对应的值. 注意:在修改HDFS的数据块大小时,首先停掉集群hadoop的运行进程,修改完毕后重新启动. 4.block块大小设置规则 在实际应用中,hdfs block块的大小设置为多少合适呢?为什么有的是64M,有的

如何在iOS中使用Block

如何在iOS中使用Block Block可以帮助我们组织独立的代码段,并提高复用性和可读性.iOS4在UIKit中引入了该特征.超过100个的Apple API都使用了Block,所以这是一个我们必须开始熟悉的知识. Block是什么样的? 你可以使用^操作符来声明一个Block变量,它表示一个Block的开始. int num1 = 7; int(^aBlock)(int) = ^)int num2) { return num1+nunm2; }; 在如上代码中我们将Block声明为一个变量,

从C语言的变量声明到Objective-C中的Block语法转载]

原文:From C Declarators to Objective-C Blocks Syntax 作者:Nils Hayat 译者:CocoaChina--sunshine 在这篇文章中,从简单的C语言中各种声明开始,以及复杂的声明组合,到最后Objective-C中的代码块bokck的语法. 花一些时间去了解代码块(block)衍生和组织形式,一旦明白了这些,就可以很方便的声明和使用它,而不用每次需要的时候才去Google一下. 如果你想把能想到的东西用block声明表现出来,请继续阅读!

iOS中使用block进行网络请求回调

iOS中使用block进行网络请求回调 HttpRequest.h // // HttpRequest.h // UseBlockCallBack // // Created by Michael on 2/13/14. // Copyright (c) 2014 EIMS. All rights reserved. // #import <Foundation/Foundation.h> typedef void (^FinishBlock)(NSString *dataString); @

文件系统的block 数据库中的block 以及内存中的page基础知识汇总(自己理解 可能有误)

1. 操作系统文件系统中的的block 文件系统中的block 是文件系统最小的读写单元,在HDD的磁盘时代, 一般block的大小可能与磁盘的扇区大小一致为 512bytes 也因为这个原因MBR启动的手 0磁道 0扇区的 512bytes 首先加载到内存, 先包含了 446byte的MBR启动信息, 还包含 64bytes 的磁盘分区信息 所以MBR的磁盘格式只支持4个主分区 并且大小仅能够扩展到2TB 后来使用GPT分区的模式可以扩充使用2TB大小以上的磁盘. 操作系统的文件簇大小 可以与

block使用小结、在arc中使用block、如何防止循环引用

引言 使用block已经有一段时间了,感觉自己了解的还行,但是几天前看到CocoaChina上一个关于block的小测试主题 : [小测试]你真的知道blocks在Objective-C中是怎么工作的吗?,发现竟然做错了几道, 才知道自己想当然的理解是错误的,所以抽时间学习了下,并且通过一些测试代码进行测试,产生这篇博客. Block简介(copy一段) Block作为C语言的扩展,并不是高新技术,和其他语言的闭包或lambda表达式是一回事.需要注意的是由于Objective-C在iOS中不支

STL中heap算法(堆算法)

 ①push_heap算法 以下是push_heap算法的实现细节.该函数接收两个迭代器,用来表现一个heap底部容器(vector)的头尾,而且新元素已经插入究竟部的最尾端. template <class RandomAccessIterator> inline void push_heap(RandomAccessIterator first,RandomAccessIterator last) { //注意,此函数被调用时,新元素应已置于底部容器的最尾端 _push_heap_au