Jon*_*nas 3 c c++ performance bit-manipulation operation
那么将一个单词分成两个字节的最快方法是什么?
short s = 0x3210;
char c1 = s >> 8;
char c2 = s & 0x00ff;
Run Code Online (Sandbox Code Playgroud)
与
short s = 0x3210;
char c1 = s >> 8;
char c2 = (s << 8) >> 8;
Run Code Online (Sandbox Code Playgroud)
怎么样
short s = 0x3210;
char* c = (char*)&s; // where c1 = c[0] and c2 = c[1]
Run Code Online (Sandbox Code Playgroud)
让编译器为您完成这项工作.使用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;
};
Run Code Online (Sandbox Code Playgroud)
用法很简单:
U u;
u.s = 0x3210;
std::cout << u.byte.c1 << " and " << u.byte.c2;
Run Code Online (Sandbox Code Playgroud)
这个概念很简单,之后您可以重载操作符,以便在需要时使其更具花哨性.
重要的是要注意,根据您的编译器的顺序c1和c2可能会有所不同,但在编译之前将会知道.您可以设置一些条件宏,以确保在任何编译器中根据您的需要进行排序.
我99.9%肯定第一个几乎和几乎所有架构中的第二个一样快.可能有一些架构没有区别(它们是相同的),而在一些架构中,后者会更慢.
我说第二个较慢的主要原因是这个数字有两个班次c2.处理器在完成第一次换档之前无法开始处理第二班次.
此外,编译器可能能够用第一个做其他聪明的东西(如果有指令要做 - 例如x86处理器可以加载s到AX,并将AL存储到c1AH中c2- 除了商店之外没有额外的指令操作),其中第二个不太可能是"已知的共同模式"(我当然从未见过在代码中使用该变体,其中该shift/and方法非常常用 - 通常在"像素循环"中,这意味着它很关键为它实现良好的优化).
一如既往,再次测量,测量和测量.除非您只对您的特定机器性能感兴趣,否则请在不同型号/制造商的处理器上进行尝试,这样您就不会在机器型号上制作5%的速度,而在另一种机型上制作速度要慢20%.