【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.
",#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/p/10532133.html