下面是我在64位linux机器上编写的函数。
void myfunc(unsigned char* arr) //array of 8 bytes is passed by reference
{
unsigned long a = 0; //8 bytes
unsigned char* LL = (unsigned char*) &a;
LL[0] = arr[6];
LL[1] = arr[3];
LL[2] = arr[1];
LL[3] = arr[7];
LL[4] = arr[5];
LL[5] = arr[4];
LL[6] = arr[0];
LL[7] = arr[2];
}现在我的问题是:
任何帮助都是徒劳无功。
问候
发布于 2010-10-01 18:08:51
a不能存储在寄存器中,因为您已经获取了它的地址。(valdo正确地指出,真正聪明的编译器可以将数组访问优化为位操作,并将a保留在寄存器中,但我从未见过编译器这样做,我不确定它最终会变得更快)。arr (指针本身)存储在寄存器中(%edi,在amd64上)。数组的内容在内存中。看起来,您正在尝试改变数组中的字节,然后将它们推入一个数字中,而您的示例生成的机器代码对此并没有太大的影响。David建议使用shift和掩码操作是好的(如果您的代码需要在大端机器上运行的话,这也可以避免问题),还有SSE向量置换指令,但我听说使用它们有点麻烦。
顺便说一句,您应该将示例函数的返回类型设置为unsigned long,并将return a;放在最末尾;然后您可以使用gcc -O2 -S,并查看从编译中得到的确切结果。不改变返回a,GCC将愉快地优化整个身体的功能,因为它没有外部可见的副作用。
发布于 2010-10-01 18:08:16
您可能会更好地使用显式shift和掩码指令来实现这一点,而不是使用数组索引。
数组操作将使编译器更难使用寄存器,因为通常不会有诸如“从寄存器A的第3字节加载8位”之类的指令。(优化的编译器可能会发现,使用移位/掩码可以做到这一点,但我不确定这有多大的可能性)。
发布于 2010-10-01 18:13:34
a是否将存储在寄存器中的问题是一个优化问题。因为没有volatile修饰符,所以智能编译器会这样做。arr也是如此。(实际上有时转换确实会产生额外的代码,但这与多重继承和多态有关)
https://stackoverflow.com/questions/3841812
复制相似问题