Rob*_*uld 30 c++ templates metaprogramming endianness
我有一些模板化的低级序列化代码,我需要在编译时明确知道系统的字节顺序(因为模板专门基于系统的字节顺序).
现在我有一个带有一些平台定义的标题,但是我宁愿通过一些模板化测试(如static_assert或boost_if)来做关于字节序的断言.原因是我的代码需要编译并在许多专业供应商的各种机器上运行,并且可能是2008年不存在的设备,因此我无法猜测可能需要进入标题年份的内容在路上.而且由于代码库的预期寿命约为10年.所以我无法永远遵循代码.
希望这能使我的情况变得清晰.
那么有没有人知道可以确定字节序的编译时测试,而不依赖于供应商特定的定义?
Has*_*kun 19
如果你正在使用autoconf,你可以使用AC_C_BIGENDIAN宏,这是相当有效的(WORDS_BIGENDIAN默认设置定义)
或者,您可以尝试类似以下内容(取自autoconf)以获得可能会被优化的测试(GCC,至少,移除其他分支)
int is_big_endian()
{
union {
long int l;
char c[sizeof (long int)];
} u;
u.l = 1;
if (u.c[sizeof(long int)-1] == 1)
{
return 1;
}
else
return 0;
}
Run Code Online (Sandbox Code Playgroud)
嗯,这是一个有趣的问题.我敢打赌,这是不可能的.我认为你必须继续使用宏,并与去BOOST_STATIC_ASSERT(!BIG_ENDIAN);,或static_assertC++ 0x中.我认为这是因为如果你的执行环境,endian'nes是一个属性.但是,在编译时考虑static_assert.
我建议你研究一下新的GNU gold ELF链接器的代码.其作者Ian Lance Taylor使用模板在编译时选择正确的字节序,以确保在运行时获得最佳性能.他明确地实例化了所有可能的endians,因此他仍然有模板定义和声明的单独编译(不是标题中的所有模板).他的代码很棒.