C++ 是否有必要考虑“BigEnd或LittleEnd“;现在的问题是什么?

C++ 是否有必要考虑“BigEnd或LittleEnd“;现在的问题是什么?,c++,endianness,C++,Endianness,我们都被告知在计算机系统中有大的一端和小的一端。但是,我的应用程序几乎都是在x86和arm体系结构下运行的,它们都是小型终端设计的系统。这样,有必要考虑这个问题吗?< /强> 什么时候考虑到endianness让我感到困惑。任何提示或巧妙的建议都将不胜感激~是的;除其他外,网络字节顺序与x86不一致 作为一般规则,切勿将字节作为memcpy从序列化中读取。始终以结构或数学方式重新打包和排列字节。这很烦人,但同时修复了端性和许多其他问题 好的编译器,如果你真的像memcpy那样编写它们,并且编译器

我们都被告知在计算机系统中有大的一端和小的一端。但是,我的应用程序几乎都是在x86和arm体系结构下运行的,它们都是小型终端设计的系统。这样,<强>有必要考虑这个问题吗?< /强>
什么时候考虑到endianness让我感到困惑。任何提示或巧妙的建议都将不胜感激~

是的;除其他外,网络字节顺序与x86不一致

作为一般规则,切勿将字节作为memcpy从序列化中读取。始终以结构或数学方式重新打包和排列字节。这很烦人,但同时修复了端性和许多其他问题


好的编译器,如果你真的像memcpy那样编写它们,并且编译器可以证明它,将进行优化。

如果你发现自己使用了任何有关体系结构终结性的信息,那么你要么编写了一个编译器/标准库,要么做错了什么

二进制数据格式确实具有endianness,这是应用程序需要考虑的。许多现有的数据格式使用big-endian表示

因此,应用程序通常只处理界面边界的端点。这在理想情况下封装在平台API中,如
htonl
ntohl
,但有时这些API不可用/不合适,实现需要提供自己的API。它仍然可以完全忽略平台的耐久性。例如,而不是

 uint32_t var;
 file.read(&var, sizeof(var));
 #if LITTLE_ENDIAN
     swap_byte_order(var);
 #endif
能写

uint32_t var; byte buf[4];
file.read(buf, sizeof(buf));
var = buf[3] | buf[2]<<8 | buf[1]<<16 | buf[0]<<24;
uint32\u t var;字节buf[4];
read(buf,sizeof(buf));

var=buf[3]| buf[2]是的。您可能会发现自己正在与一个用Java.Yup编写的程序交互。我出现在最奇怪的地方。例如,ICC颜色配置文件的规范(color.org)是一个字节块,在其格式规范中使用了big-endian,我必须适应它。网络字节顺序(由TCP/IP使用,由RFC1700指定)是big-endian。如果您的应用程序执行任何与网络相关的操作,或者与其他人编写的应用程序进行交互,则有点难以避免。ARM具有little-endian和big-endian模式,尽管我同意在移动计算世界中little-endian很流行。首先,没有问题。处理BigEndian格式转换可能确实是必要的,但在默认情况下永远不会。即使您真的需要处理它,它也很可能仅限于程序的一小部分。即使在编写一些Java互操作或网络内容时,让整个程序BigEndian就绪也毫无意义。这样做将过于工程化。它与其他数据表示相同,例如定点数字。谢谢您的回答。这对我很有帮助。顺便问一下,有什么技巧可以简化这个恼人的问题吗?比如,界面设计,或者其他有用的技巧。更不用说PowerPC和锋利的边缘了。Linux以little-endian模式在PPC上运行,而AIX以big-endian模式运行。为它们编写的源代码必须执行自己的endian循环,即使使用高级代码也是如此。