我最近遇到了一个奇怪的去优化(或者错过了优化机会).
考虑此函数可以有效地将3位整数数组解包为8位整数.它在每次循环迭代中解包16个int:
void unpack3bit(uint8_t* target, char* source, int size) {
while(size > 0){
uint64_t t = *reinterpret_cast<uint64_t*>(source);
target[0] = t & 0x7;
target[1] = (t >> 3) & 0x7;
target[2] = (t >> 6) & 0x7;
target[3] = (t >> 9) & 0x7;
target[4] = (t >> 12) & 0x7;
target[5] = (t >> 15) & 0x7;
target[6] = (t >> 18) & 0x7;
target[7] = (t >> 21) & 0x7;
target[8] = (t >> 24) & 0x7;
target[9] = …Run Code Online (Sandbox Code Playgroud) c++ optimization strict-aliasing compiler-optimization c++11
根据C和C++ , CHAR_BIT >= 8.
但无论何时CHAR_BIT > 8,uint8_t甚至都不能表示为8位.
它必须更大,因为它CHAR_BIT是系统上任何数据类型的最小位数.
什么样的系统可以uint8_t合法地定义为除了以外的类型unsigned char?
(如果C和C++的答案不同,那么我想知道两者.)