是否在目标平台上评估constexpr



例如,我想知道在小端序平台上编译的evaluated是否会在大端序目标平台上返回true。

constexpr bool is_little_endian()
{
int num = 1;
return (1 == *(char *)&num);
}

换句话说,constexpr的计算是否像在目标上一样?

编辑:这个例子不正确,但问题仍然存在。

首先:如果为给定目标编译代码,那么编译器将为目标生成代码。当然,这包括在编译时计算的表达式——否则,涉及此类表达式的每一次交叉编译都会被破坏。

然而,仅仅将函数标记为constexpr并不能保证在编译时对其求值。特别是,您的示例函数(根据标准(不能在编译时进行评估,因此它与主要问题正交。

正如注释中所述,如果不直接查询编译器,就无法在编译时真正找到endianness。编译器必须知道(因为它必须生成代码(,任何合理的编译器都会为您提供一种查询这些信息的方法(在编译时(。

这不是一个有效的constexpr函数,因为它包含了reinterpret_cast。这使得整个问题变得毫无意义。

这里概述了这不是有效的constexpr函数的原因:https://en.cppreference.com/w/cpp/language/constexpr.特别是,constexpr函数应该满足以下标准:

。。。至少存在一组参数值,使得函数的调用可以是核心常数表达式

reinterpret_cast永远不能是核心常量表达式的一部分。

是的。如果您有一个可用的C++20编译器(可能是-std=c++2a(,您可以尝试为具有不同端序的平台编译它,并检查它的行为是否正确。
#include <bit>
#include <iostream>
constexpr bool are_all_scalar_types_little_endian() {
return std::endian::native == std::endian::little;
}
constexpr bool are_all_scalar_types_big_endian() {
return std::endian::native == std::endian::big;
}
int main() {
std::cout << std::boolalpha
<< "little: " << are_all_scalar_types_little_endian() << 'n'
<< "big   : " << are_all_scalar_types_big_endian() << 'n'
<< "mixed : " << 
(are_all_scalar_types_little_endian()==are_all_scalar_types_big_endian()) << 'n';
}

最新更新