malloc分配内存进行对齐的操作
昨天面试高通Linux Kernel,面试官考了一个malloc内存对齐的问题,我晚上的时候细细的想了一下,实在是学习的不到位。
有的时候真的应该感谢,像是Qt、Ubuntu Gcc的编译器,他们做的工作很多,malloc直接分配对齐了的内存。如果真的是一个
不是很完善的平台,直接分配给你一个没对齐的内存,当我们传输字节指令的时候分高低八位的时候,定义联合体和结构体这样的偷懒方式
绝对会发一个错误的指令。
oh 要学的太多了。。。。
实际上,对齐参数(MALLOC_ALIGNMENT)大小的设定需要满足以下两点:
-
必须是2的幂
-
必须是void *的整数倍
所以从request2size可知,在64位系统,如果申请内存为1~24字节,系统内存消耗32字节,当申请25字节的内存时,系统内存消耗48字节。而对于32位系统,申请内存为1~12字节时,系统内存消耗为16字节,当申请内存为13字节时,系统内存消耗为24字节。
#include <stdio.h> #include <stdlib.h> #include <stdint.h> void* aligned_malloc(size_t required_bytes, size_t alignment) { int offset = alignment - 1 + sizeof(void*); void* p1 = (void*)malloc(required_bytes + offset); if (p1 == NULL) return NULL; void** p2 = (void**)( ( (size_t)p1 + offset ) & ~(alignment - 1) ); p2[-1] = p1; return p2; } void aligned_free(void *p2) { void* p1 = ((void**)p2)[-1]; free(p1); } int main() { void * p[128]; int i; for(i = 0; i < 128; ++i) { p[i] = aligned_malloc(i, 16); printf("%p\n", p[i]); } for(i = 0; i < 128; ++i) { aligned_free( p[i] ); } return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理