那么,将一个单词分割成两个字节的最快方法是什么呢?
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]发布于 2013-07-25 11:19:53
我99.9%确信,在几乎所有的架构中,第一个架构的速度至少与第二个体系结构的速度一样快。可能有些体系结构没有什么区别(它们是相等的),而在几个体系结构中,后者会慢一些。
我要说的第二个比较慢的主要原因是,有两个班次要计算出c2数。在完成第一班之前,处理器无法开始处理第二班。
此外,编译器很可能能够对第一个模式执行其他聪明的操作(如果有这样的指令--例如,x86处理器可以将s加载到AX中,并将AL存储到c1中,将AL存储到c2中--而不是存储操作之外的额外指令),在存储操作之外,第二个指令不太可能是“已知的公共模式”(我肯定从未见过在代码中使用该变体--通常在“像素循环”中使用shift/and方法,这意味着为它实现良好的优化至关重要)。
像往常一样,测量,测量,再测量。除非您只对特定的机器性能感兴趣,请在不同的型号/处理器制造商上尝试它,这样您就不会在您的机器模型上制造速度快5%的产品,而在另一种型号上制造速度会慢20%。
发布于 2013-07-25 11:31:19
让编译器为您完成此工作。使用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的顺序可能不同,但在编译之前就知道了。您可以设置一些条件宏,以确保顺序是根据您的需要在任何编译器。
发布于 2013-07-25 11:33:24
当然,您应该使用一个强制转换,而不是一个掩码或两个轮班来提取低阶字节。然后编译器将做它已经知道最快的事情。这就给你留下了一个只有一个选择的高阶位。
https://stackoverflow.com/questions/17856329
复制相似问题