我正在阅读 ESRI Shapefile , 令我沮丧的是它在不同的点使用大端和小端(例如,参见第 4 页的表格,以及第 5 到 8 页的表格)。
所以我用 C++ 创建了两个函数,每个函数一个 endianness .
uint32_t readBig(ifstream& f) {
uint32_t num;
uint8_t buf[4];
f.read((char*)buf,4);
num = buf[3] | buf[2]<<8 | buf[1]<<16 | buf[0]<<24;
return num;
}
uint32_t readLittle(ifstream& f) {
uint32_t num;
f.read(reinterpret_cast<char *>(&num),4);
//f.read((char*)&num,4);
return num;
}
但我不确定这是最有效的方法。 可以改进这段代码吗?请记住,它会为单个 shapefile 运行数千次,甚至数百万次。因此,即使有一个函数调用另一个函数似乎也比有两个单独的函数更糟糕。使用 reinterpret_cast 或显式类型转换 (char*) 在性能上有区别吗?我应该在两个函数中使用相同的函数吗?
最佳答案
- 指针类型之间的转换不影响性能——在 在这种情况下,让编译器满意只是技术问题。
- 如果您真的要为每个 32 位单独调用
read
值,字节交换操作所花费的时间可能是 在噪音中。为了速度,你可能应该有自己的 缓冲层,以便您的内部循环不会产生任何功能 电话。 - 如果交换编译为单个操作码(如
bswap
),那很好,但无论是否 是可能的,还是最快的选项,是特定于处理器的。 - 如果您真的对最大限度地提高速度感兴趣,请考虑使用 SIMD 内部函数。
关于c++ - 从 C++ 中的二进制文件读取不同字节顺序的整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53530497/