未对齐数据的运行速度

据我所知,一个CPU在边界上对齐的数据与该数据的大小相等时效果最好。 例如,如果每个int数据的大小为4个字节,则每个int的地址必须是4的倍数以使CPU高兴; 与2字节short数据和8字节double数据相同。 由于这个原因, new运算符和malloc函数总是返回一个8的倍数的地址,因此它是4和2的倍数。

在我的程序中,一些意味着处理大字节数组的时间关键算法允许通过将每个连续的4个字节转换为unsigned int跨越计算,并以这种方式更快地进行算术。 但是,字节数组的地址不能保证是4的倍数,因为只需要处理一部分字节数组。

据我所知,英特尔CPU可以正确操作未对齐的数据,但会以速度为代价。 如果在未对齐的数据上运行足够慢,我的程序中的算法将需要重新设计。 在这方面,我有两个问题,第一个问题由以下代码支持:

// the address of array0 is a multiple of 4:
unsigned char* array0 = new unsigned char[4];
array0[0] = 0x00;
array0[1] = 0x11;
array0[2] = 0x22;
array0[3] = 0x33;
// the address of array1 is a multiple of 4 too:
unsigned char* array1 = new unsigned char[5];
array1[0] = 0x00;
array1[1] = 0x00;
array1[2] = 0x11;
array1[3] = 0x22;
array1[4] = 0x33;
// OP1: the address of the 1st operand is a multiple of 4,
// which is optimal for an unsigned int:
unsigned int anUInt0 = *((unsigned int*)array0) + 1234;
// OP2: the address of the 1st operand is not a multiple of 4:
unsigned int anUInt1 = *((unsigned int*)(array1 + 1)) + 1234;

所以问题是:

  • 与x86,x86-64和Itanium处理器上的OP1相比,OP2的速度要慢多少(如果忽略类型转换和地址增量的成本)?

  • 在编写跨平台可移植代码时,关于哪些处理器应该关注数据访问不对齐? (我已经知道RISC的)


  • 市场上有太多的处理器能够给出一个通用的答案。 唯一可以肯定地说明的是,一些处理器根本无法完成未对齐的访问; 如果你的程序打算在同类环境中运行,例如Windows,这对你来说可能并不重要。

    在现代高速处理器中,未对齐访问的速度可能比其地址对齐更受缓存对齐的影响。 在今天的x86处理器上,高速缓存行大小为64字节。

    有一篇维基百科文章可能会提供一些一般指导:http://en.wikipedia.org/wiki/Data_structure_alignment

    链接地址: http://www.djcxy.com/p/9159.html

    上一篇: Speed of operations on misaligned data

    下一篇: How to access shared preference between activities in android?