码迷,mamicode.com
首页 > 编程语言 > 详细

[C/C++]_[中级]_[数据地址对齐]

时间:2015-02-27 23:03:20      阅读:368      评论:0      收藏:0      [点我收藏+]

标签:地址对齐   指针   c++   偏移   align   


场景:

1. 有些频繁使用的指针变量地址不对齐的话运行效率和对齐后的运行效率差别很大,所以在创建堆空间时,有必要对内存地址对齐提高运行效率.

2. 有些音视频处理的代码或者说自定义的malloc基本都是地址对齐的.

3. 使用原子访问的互锁函数时,InterlockedExchangeAdd都需要地址对齐.

4. 主要还是宏APR_ALIGN, 这个说是Apache源码里,就借用一下吧。


解决方案:

1. 其实就是让地址值对对齐量求模为0, 地址值最多增加n-1个偏移地址就可就可以整出n.  &~(n-1)就是能整除n的快捷方法,相当于左移2的倍数位.


#include <iostream>
#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>
#include <assert.h>
using namespace std;

// Apache
/* APR_ALIGN() is only to be used to align on a power of 2 boundary */
#define APR_ALIGN(size, boundary)     (((size) + ((boundary) - 1)) & ~((boundary) - 1))


void TestAlgin()
{
	//1. 32字节对齐. 数值地址.要对齐地址,一般会创建多出的空间来对齐.
	//1. 需要创建16字节空间,如果需要32字节对齐.
	uint8_t* value = (uint8_t*)malloc(16+32);
	cout <<"1 " << (int64_t)(int64_t*)(value) << endl;
	int64_t* value_offset = (int64_t*)APR_ALIGN((int64_t)(int64_t*)value,32);
	cout <<"2 " << (int64_t)(int64_t*)(value_offset) << endl;

	//1. 测试自定义4字节对齐,源地址是5,最终地址是8.
	int64_t v1 = APR_ALIGN(5,sizeof(int32_t));
	assert(v1 == 8);

	//1. 测试自定义8字节对齐,原地址是10,最终地址是16
	v1 = APR_ALIGN(10,sizeof(int64_t));
	assert(v1 == 16);
}

int main(int argc, char const *argv[])
{
	TestAlgin();
	return 0;
}


输出:

1 6314480
2 6314496



参考:

http://bbs.csdn.net/topics/370085011

http://bbs.chinaunix.net/thread-1233919-1-1.html

《Windows核心编程 第4版》



[C/C++]_[中级]_[数据地址对齐]

标签:地址对齐   指针   c++   偏移   align   

原文地址:http://blog.csdn.net/infoworld/article/details/43972449

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!