那么将一个单词分成两个字节的最快方法是什么?
short s = 0x3210;
char c1 = s >> 8;
char c2 = s & 0x00ff;
与
short s = 0x3210;
char c1 = s >> 8;
char c2 = (s << 8) >> 8;
怎么样
short s = 0x3210;
char* c = (char*)&s; // where c1 = c[0] and c2 = c[1]
答案 0 :(得分:7)
让编译器为您完成这项工作。使用union
,其中字节将被拆分而不需要任何手动位移。看一下伪代码:
union U {
short s; // or use int16_t to be more specific
// vs.
struct Byte {
char c1, c2; // or use int8_t to be more specific
}
byte;
};
用法很简单:
U u;
u.s = 0x3210;
std::cout << u.byte.c1 << " and " << u.byte.c2;
这个概念很简单,之后你可以重载操作符,使它更加花哨。
重要的是要注意,根据您的编译器,c1
和c2
的顺序可能不同,但在编译之前将会知道。您可以设置一些条件宏,以确保在任何编译器中根据您的需要进行排序。
答案 1 :(得分:6)
我99.9%肯定第一个至少与几乎所有架构中的第二个一样快。可能有一些架构没有区别(它们是相同的),而在一些架构中,后者会更慢。
我说第二个较慢的主要原因是c2
号有两个班次。处理器在完成第一次换班之前无法开始处理第二班次。
此外,编译器可能能够使用第一个聪明的东西(如果有指令要做 - 例如x86处理器可以将s
加载到AX中,并将AL存储到{{ 1}}和AH进入c1
- 除了存储操作之外没有额外的指令),其中第二个不太可能是“已知的常见模式”(我当然从未见过在代码中使用该变体,其中c2
方法非常常用 - 通常在“像素循环”中,这意味着对它实现良好的优化至关重要。)
与往常一样,再次进行测量,测量和测量。除非您只对您的特定机器性能感兴趣,否则请在不同型号/制造商的处理器上进行尝试,这样您就不会在机器型号上制作5%的速度,而在另一种机型上制作速度要慢20%。
答案 2 :(得分:1)
你当然应该使用强制转换而不是掩码或两个移位来提取低位字节。然后编译器将执行它已知的最快的任何事情。这会让你得到高位,只有一个选择。
答案 3 :(得分:1)
您应该在for (long i = 0; i < 100000000; i++)
中为每个人计时。我做了,第一个更快(0.82秒对0.84秒)。在MVS中这样做的一种简单方法是在@clk
上设置监视。