【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外包
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号