在编译阶段翻转字节

在解析协议的时候,需要将一个大端字序的整数,转成小端字序,比如内存中有[1,2,3,4]四个字节,我们需要翻转成[4,3,2,1]。传统做法要么循环,要么硬编码。那么如果现在有位数不定的情况下需要翻转呢?

这时候C++的模版函数大显身手了,请看如下代码(u8是8位无符号整数类型)

template 
inline void reverse(u8 *a, u8 *b)
{
    *a = *b;
    reverse(a + 1, b - 1);
}
template <>
inline void reverse<1>(u8 *a, u8 *b)
{
    *a = *b;
}

模版参数除了常见的替换类型以外,还有这种传递一个整数常量的方式。当我们调用这个reverse函数的时候,编译器会在编译阶段展开函数,由于内部我们递归调用了reverse,编译器会递归的展开这个函数。

比如我们调用了reverse<4>(a,b+3):a是翻转后的字节地址,b是原始字节地址。
那么相当于下面的代码

*a = *b
*(a+1) = *(b-1)
*(a+2) = *(b-2)
*(a+3) = *(b-3)

这就是C++模版函数的妙用,希望给你启发。

你可能感兴趣的:(在编译阶段翻转字节)