malloc(malloc在32位编译系统中分配的地址会8字节对齐,64为编译系统中会8或者16字节对齐)

2024-03-01 00:08

本文主要是介绍malloc(malloc在32位编译系统中分配的地址会8字节对齐,64为编译系统中会8或者16字节对齐),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

了解malloc分配策略的人都知道,malloc在32位编译系统中会8字节对齐,64为编译系统中会8或者16字节对齐。

故32位malloc分配后的首地址肯定是8的整数倍。

       举例说明:
32位系统环境, 假设按4字节对齐,分配8字节的存储空间存储long long型的内容。
malloc获取地址为0x1acf3014(4字节对齐), 返回给用户的地址为0x1acf300c(实际存储数据的地址),  如果long long
型的数据放入这个地址,由于__alignof__(long long)=8,要求8字节对齐。所以该数据由于内存未对齐访问效率低下,甚

至访问出错。

         如果在32位系统自己实现的malloc函数空间不按照8字节对齐,会产生问题(如果自己实现的malloc函数返回的是4字节对齐的内存地址,比如0x0000000c,而分配的此首地址0x0000000c不能被8整除,但是我要在0x0000000c-0x00000014 放置longlong 8个字节的变量类型就会出现问题),此问题会类似我的另一篇文章如果指定在不能被4整除的内存地址上放置int型变量会发生什么。

至于什么是内存对齐、为什么要做内存对齐,这涉及到计算机体系结构相关知识。已经有很多前辈写了许多
关于内存对齐的相关文章,如果感兴趣可以google。
malloc的相关源代码如下:

#ifndef INTERNAL_SIZE_T
#define INTERNAL_SIZE_T size_t
#endif

/* The corresponding word size */
#define SIZE_SZ                (sizeof(INTERNAL_SIZE_T))

#ifndef MALLOC_ALIGNMENT
/* #define MALLOC_ALIGNMENT       (2 * SIZE_SZ < __alignof__ (long double) \
                ? __alignof__ (long double) : 2 * SIZE_SZ)
*/
#define MALLOC_ALIGNMENT       (2 * SIZE_SZ)
#endif


MALLOC_ALIGNMENT 就是malloc的最小对齐参数,也是研究的重点。那这里为什么要2*SIZE_SZ对齐呢? 
其实上面红色字体才是MALLOC_ALIGNMENT宏的正确定义。 只是这样定义会带来一些兼容性的问题,故而采用
2*SIZE_SZ定义(对于大多数平台这种定义也是正确的), 看来这里只是想表示最大元类型的字节数的意思。我们
知道元类型、结构类型等都是要作内存对齐的(主要是从寻址和访问效率上考虑)。那么我们在采用动态内存分配的
时候也要保证存储的数据是内存对齐的。但malloc分配内存的时候不知道内存的用途。所以就只有按最大元类型对齐。
举例说明:
32位系统环境, 假设按4字节对齐,分配8字节的存储空间存储long long型的内容。
malloc获取地址为0x1acf3014(4字节对齐), 返回给用户的地址为0x1acf300c(实际存储数据的地址),  如果long long
型的数据放入这个地址,由于__alignof__(long long)=8,要求8字节对齐。所以该数据由于内存未对齐访问效率低下,甚
至访问出错。 
动态分配内存对齐一般是按系统最大元类型的对齐要求来对齐内存的。 这个值就是最小的对齐参数。小于这个值就会出
现内存无法对齐的现象。 当然选择比这个值大是没有问题的(比如16)。

以上是我个人的理解,如有错误,欢迎批评指正。

这篇关于malloc(malloc在32位编译系统中分配的地址会8字节对齐,64为编译系统中会8或者16字节对齐)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/760542

相关文章

nginx upstream六种方式分配小结

《nginxupstream六种方式分配小结》本文主要介绍了nginxupstream六种方式分配小结,包括轮询、加权轮询、IP哈希、公平轮询、URL哈希和备份服务器,具有一定的参考价格,感兴趣的可... 目录1 轮询(默认)2 weight3 ip_hash4 fair(第三方)5 url_hash(第三

golang内存对齐的项目实践

《golang内存对齐的项目实践》本文主要介绍了golang内存对齐的项目实践,内存对齐不仅有助于提高内存访问效率,还确保了与硬件接口的兼容性,是Go语言编程中不可忽视的重要优化手段,下面就来介绍一下... 目录一、结构体中的字段顺序与内存对齐二、内存对齐的原理与规则三、调整结构体字段顺序优化内存对齐四、内

Ubuntu固定虚拟机ip地址的方法教程

《Ubuntu固定虚拟机ip地址的方法教程》本文详细介绍了如何在Ubuntu虚拟机中固定IP地址,包括检查和编辑`/etc/apt/sources.list`文件、更新网络配置文件以及使用Networ... 1、由于虚拟机网络是桥接,所以ip地址会不停地变化,接下来我们就讲述ip如何固定 2、如果apt安

查询SQL Server数据库服务器IP地址的多种有效方法

《查询SQLServer数据库服务器IP地址的多种有效方法》作为数据库管理员或开发人员,了解如何查询SQLServer数据库服务器的IP地址是一项重要技能,本文将介绍几种简单而有效的方法,帮助你轻松... 目录使用T-SQL查询方法1:使用系统函数方法2:使用系统视图使用SQL Server Configu

使用Java实现获取客户端IP地址

《使用Java实现获取客户端IP地址》这篇文章主要为大家详细介绍了如何使用Java实现获取客户端IP地址,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 首先是获取 IP,直接上代码import org.springframework.web.context.request.Requ

Linux环境变量&&进程地址空间详解

《Linux环境变量&&进程地址空间详解》本文介绍了Linux环境变量、命令行参数、进程地址空间以及Linux内核进程调度队列的相关知识,环境变量是系统运行环境的参数,命令行参数用于传递给程序的参数,... 目录一、初步认识环境变量1.1常见的环境变量1.2环境变量的基本概念二、命令行参数2.1通过命令编程

C++实现获取本机MAC地址与IP地址

《C++实现获取本机MAC地址与IP地址》这篇文章主要为大家详细介绍了C++实现获取本机MAC地址与IP地址的两种方式,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 实际工作中,项目上常常需要获取本机的IP地址和MAC地址,在此使用两种方案获取1.MFC中获取IP和MAC地址获取

C/C++通过IP获取局域网网卡MAC地址

《C/C++通过IP获取局域网网卡MAC地址》这篇文章主要为大家详细介绍了C++如何通过Win32API函数SendARP从IP地址获取局域网内网卡的MAC地址,感兴趣的小伙伴可以跟随小编一起学习一下... C/C++通过IP获取局域网网卡MAC地址通过win32 SendARP获取MAC地址代码#i

Go语言使用Buffer实现高性能处理字节和字符

《Go语言使用Buffer实现高性能处理字节和字符》在Go中,bytes.Buffer是一个非常高效的类型,用于处理字节数据的读写操作,本文将详细介绍一下如何使用Buffer实现高性能处理字节和... 目录1. bytes.Buffer 的基本用法1.1. 创建和初始化 Buffer1.2. 使用 Writ

.NET利用C#字节流动态操作Excel文件

《.NET利用C#字节流动态操作Excel文件》在.NET开发中,通过字节流动态操作Excel文件提供了一种高效且灵活的方式处理数据,本文将演示如何在.NET平台使用C#通过字节流创建,读取,编辑及保... 目录用C#创建并保存Excel工作簿为字节流用C#通过字节流直接读取Excel文件数据用C#通过字节