Vij*_*jay 5 c optimization masking
在下面的代码中是赋值所需的掩码.
unsigned int x = 0x01020304;
unsigned char a1, a2, a3, a4;
a1 = (x >> 24) & 0xff;
a2 = (x >> 16) & 0xff;
a3 = (x >> 8) & 0xff;
a4 = x & 0xff ;
Run Code Online (Sandbox Code Playgroud)
我确实意识到它没有它可以正常工作,但我在所有标准/已审查的代码中找到了这些分配......是不是浪费了周期?
感谢您对上述代码的回复,似乎编译器忽略(优化)了掩码,如下面的objdump所示.
a1 = (x >> 24) & 0xff;
804838b: 8b 45 fc mov 0xfffffffc(%ebp),%eax
804838e: c1 e8 18 shr $0x18,%eax
8048391: 88 45 fb mov %al,0xfffffffb(%ebp)
Run Code Online (Sandbox Code Playgroud)
我喜欢屏蔽代码,因为它清楚地表达了作者的意图,即仅保留每个操作的最后 8 位。编译器能够对其进行优化(在一个字节正好有 8 位的平台上),而在其他平台上,无论如何屏蔽都是必要的。