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

相关文章

Android与iOS设备MAC地址生成原理及Java实现详解

《Android与iOS设备MAC地址生成原理及Java实现详解》在无线网络通信中,MAC(MediaAccessControl)地址是设备的唯一网络标识符,本文主要介绍了Android与iOS设备M... 目录引言1. MAC地址基础1.1 MAC地址的组成1.2 MAC地址的分类2. android与I

Java实现按字节长度截取字符串

《Java实现按字节长度截取字符串》在Java中,由于字符串可能包含多字节字符,直接按字节长度截取可能会导致乱码或截取不准确的问题,下面我们就来看看几种按字节长度截取字符串的方法吧... 目录方法一:使用String的getBytes方法方法二:指定字符编码处理方法三:更精确的字符编码处理使用示例注意事项方

Java根据IP地址实现归属地获取

《Java根据IP地址实现归属地获取》Ip2region是一个离线IP地址定位库和IP定位数据管理框架,这篇文章主要为大家详细介绍了Java如何使用Ip2region实现根据IP地址获取归属地,感兴趣... 目录一、使用Ip2region离线获取1、Ip2region简介2、导包3、下编程载xdb文件4、J

使用Python实现IP地址和端口状态检测与监控

《使用Python实现IP地址和端口状态检测与监控》在网络运维和服务器管理中,IP地址和端口的可用性监控是保障业务连续性的基础需求,本文将带你用Python从零打造一个高可用IP监控系统,感兴趣的小伙... 目录概述:为什么需要IP监控系统使用步骤说明1. 环境准备2. 系统部署3. 核心功能配置系统效果展

如何解决idea的Module:‘:app‘platform‘android-32‘not found.问题

《如何解决idea的Module:‘:app‘platform‘android-32‘notfound.问题》:本文主要介绍如何解决idea的Module:‘:app‘platform‘andr... 目录idea的Module:‘:app‘pwww.chinasem.cnlatform‘android-32

Python中使用正则表达式精准匹配IP地址的案例

《Python中使用正则表达式精准匹配IP地址的案例》Python的正则表达式(re模块)是完成这个任务的利器,但你知道怎么写才能准确匹配各种合法的IP地址吗,今天我们就来详细探讨这个问题,感兴趣的朋... 目录为什么需要IP正则表达式?IP地址的基本结构基础正则表达式写法精确匹配0-255的数字验证IP地

Oracle存储过程里操作BLOB的字节数据的办法

《Oracle存储过程里操作BLOB的字节数据的办法》该篇文章介绍了如何在Oracle存储过程中操作BLOB的字节数据,作者研究了如何获取BLOB的字节长度、如何使用DBMS_LOB包进行BLOB操作... 目录一、缘由二、办法2.1 基本操作2.2 DBMS_LOB包2.3 字节级操作与RAW数据类型2.

Linux系统中配置静态IP地址的详细步骤

《Linux系统中配置静态IP地址的详细步骤》本文详细介绍了在Linux系统中配置静态IP地址的五个步骤,包括打开终端、编辑网络配置文件、配置IP地址、保存并重启网络服务,这对于系统管理员和新手都极具... 目录步骤一:打开终端步骤二:编辑网络配置文件步骤三:配置静态IP地址步骤四:保存并关闭文件步骤五:重

Linux配置IP地址的三种实现方式

《Linux配置IP地址的三种实现方式》:本文主要介绍Linux配置IP地址的三种实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录环境RedHat9第一种安装 直接配置网卡文件第二种方式 nmcli(Networkmanager command-line

Linux虚拟机不显示IP地址的解决方法(亲测有效)

《Linux虚拟机不显示IP地址的解决方法(亲测有效)》本文主要介绍了通过VMware新装的Linux系统没有IP地址的解决方法,主要步骤包括:关闭虚拟机、打开VM虚拟网络编辑器、还原VMnet8或修... 目录前言步骤0.问题情况1.关闭虚拟机2.China编程打开VM虚拟网络编辑器3.1 方法一:点击还原VM