【C编程系列】之朝花夕拾:(1) 基础知识
DATE: 2019-3-8
前言
本系列为重读C/C++ Primer技术书的读书笔记。
1、关于内存对齐
内存对齐包括内存起始地址对齐和内存长度对齐。这点要牢记。
(1)堆的内存对齐:
malloc函数对应__align_malloc函数。注意在分配内存之后建议直接将起始地址进行对齐。
示例如下:
#define ASSERT_NOTERURN(a) \
do{ \
if(!a) \
printf("%s failed at %s:%d.\n",#a, __FILE__, __LINE__);\
}while(0)
#define MEM_ALIGN 16
void align_free(void *ptr)
{
if(ptr)
{
int v=((char*)ptr)[-1];//查看当前对齐指针的前一个字节的大小
ASSERT_NOTERURN(v>0 && v< MEM_ALIGN);
free((char*)ptr -v); //定位到开始内存分配的位置
}
}
void* align_malloc(size_t size)
{
void *ptr = NULL;
int diff;
if(size >(0x7fffffffu -32) || !size)
return NULL;
ptr = malloc(size + MEM_ALIGN);
if(!ptr)
{
return ptr;
}
diff = ((~(int)ptr)&(MEM_ALIGN - 1)) + 1;//内存起始地址对齐需要偏移的字节数
ptr = (char*)ptr + diff;//偏移到内存对齐的位置
((char*)ptr)][-1] = (char)diff;
if(!ptr && !size)
{
size = 1;
ptr = align_malloc(1);
}
return ptr;
}
(2)栈的内存对齐:
int a[50];
__declspec(align(16)) int a[50];
注意:不同平台下对齐声明的方式可能不同。
本文为博主原创文章,未经博主允许不得转载。若允许转载,请注明来源https://www.cnblogs.com/SoaringLee/,否则保留追究法律责任的权利!
另外,本人提供付费咨询服务并长期承接各类毕设以及外包项目。联系QQ:2963033731。加Q备注:CNBLOG外包
分类:
【编程语言系列】
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架