在硬件开发中,有时为了提高系统性能,需要数组等数据结构按照指定字节对齐,在这里对字节对齐作一个简单总结:
1.__declspec(align(#))
该方法可以指定定义的数据按照#字节对齐,#必须是2的幂,例如
__declspec(align(32)) char p1[1000];
cout<<((int64_t)p1)%32<<endl;
上面的数组p1,其起始地址就是32字节对齐的,可以预见,打印结果应为0
2._aligned_malloc(或者memalign),因编译器而异
void* aligned_malloc(size_t size, size_t alignment)
void * memalign (size_t boundary, size_t size)
上述方法可以在申请内存时,要求返回的地址为alignment或者boundary的整数倍,这里alignment和boundary也都必须是2的幂。
3.自己实现
char a[MAX_LEN+14];
cout<<((int64_t)a)%14<<endl;
int64_t addr=(int64_t)a;
if(addr%14!=0){ //实现14字节对齐
addr=(addr/14+1)*14;
}
char *b=(char*)addr; //b数组的长度至少为MAX_LEN
cout<<((int64_t)b)%14<<endl;
所有代码
#include <iostream>
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define MAX_LEN 10000
using namespace std;
int main()
{
//2的幂字节对齐
__declspec(align(32)) char p1[1000];
cout<<((int64_t)p1)%32<<endl;
char*p2=(char*)_aligned_malloc(64, 1000*sizeof(char));
cout<<((int64_t)p2)%64<<endl;
//任意字节对齐
char a[MAX_LEN+14];
cout<<((int64_t)a)%14<<endl;
int64_t addr=(int64_t)a;
if(addr%14!=0){ //实现14字节对齐
addr=(addr/14+1)*14;
}
char *b=(char*)addr; //b数组的长度至少为MAX_LEN
cout<<((int64_t)b)%14<<endl;
return 0;
}
运行结果和预期相符合
?
|