zoukankan      html  css  js  c++  java
  • 【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];
    

    注意:不同平台下对齐声明的方式可能不同。

  • 相关阅读:
    DP大作战—状态压缩dp
    DP大作战—组合背包
    DP大作战——多重背包
    单链表的使用——计算多项式加法
    单链表逆置
    钢条切割问题
    哈夫曼树及解码
    双“11”的抉择
    矩阵链相乘助教版代码
    abs()函数的返回值问题
  • 原文地址:https://www.cnblogs.com/SoaringLee/p/10532133.html
Copyright © 2011-2022 走看看