【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外包