内存对齐函数

      课本上经常提到“内存对齐”,我一直感觉这是个很抽象的概念。最近在调试代码的时候,偶然发现了一个函数,竟然实现了这个功能!

      “内存对齐”应该是编译器的“管辖范围”,编译器将程序中的每个数据单元安排在适当的位置上。

 /*!
  Aligns buffer size by the certain number of bytes
  
  This small inline function aligns a buffer size by the certian number of bytes by enlarging it.
*/
static inline size_t alignSize(size_t sz, int n)
{
    return (sz + n-1) & -n;
}
数据sz要存储到内存中,以N为单位进行内存对齐。
该函数返回的是实际中要分配的内存空间。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
内存对齐是指数据在内存中存储时需要占用整数倍的字节大小,这样可以提高访问速度和内存利用率。实现内存对齐可以使用以下方法: 1. 结构体成员变量对齐 在结构体定义时,可以使用 #pragma pack(n) 指令来指定结构体成员变量的对齐方式,其中 n 表示对齐字节数。默认情况下,n 的值为 8,也就是说结构体成员变量的大小必须是 8 的倍数。可以根据实际需要设置不同的 n 值。 2. 变量对齐 使用 __attribute__((aligned(n))) 或者 __declspec(align(n)) 关键字来指定变量的对齐方式,其中 n 表示对齐字节数。例如: ```c++ int __attribute__((aligned(16))) a; __declspec(align(16)) int b; ``` 上述代码中,变量 a 和 b 都被指定为以 16 字节对齐,即占用 16 的整数倍的字节大小。 3. 内存对齐函数 可以使用内存对齐函数来实现内存对齐,例如: ```c++ void *aligned_malloc(size_t size, size_t alignment) { void *p1, *p2; size_t offset = alignment - 1 + sizeof(void*); p1 = malloc(size + offset); if (!p1) { return NULL; } p2 = (void*)(((size_t)p1 + offset) & ~(alignment - 1)); ((void**)p2)[-1] = p1; return p2; } void aligned_free(void *p) { free(((void**)p)[-1]); } ``` aligned_malloc 函数会分配一块大小为 size + alignment - 1 + sizeof(void*) 的内存,并将其地址按照 alignment 字节对齐。使用 aligned_free 函数释放内存时,需要先获取原始的地址再调用 free 函数。 以上是实现内存对齐的几种方法,具体选择哪种方法取决于实际情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值