C++11 中的 constexpr 概念

constexpr concept in c++11

我打算了解 C++ 中 constexpr 的概念。我的理解是 constexpr 在编译时得到评估。在 here 中,我找到了一个示例,其中包含以下代码段。

int z[30];

constexpr auto e2 = &z[20] - &z[3];

他们正在计算编译时地址之间的差异。当我们不知道编译时地址的实际值时,如何在编译时对其进行评估?

constexpr auto e2 = &z[20] - &z[3]; 

只是计算第三个和第20个元素之间的偏移量。所以没有必要知道地址。

另一方面,以下示例不起作用,因为 z[20]t 的地址是在运行时计算的。

int z[30];
int t;
constexpr auto e2 = &z[20] - &t;

正如 Passer By 所指出的,根据标准(7.6.6 Additive operators,最后一句),这是未定义的行为:

Unless both pointers point to elements of the same array object, or one past the last element of the array object, the behavior is undefined.

编译器不需要知道地址的实际值。它采用简单的指针算法。由于z是整数数组,数组中两个整数的地址相减得到下标的差。

所以

constexpr auto e2 = &z[20] - &z[3];

将导致 17 的值被分配给 e2。

编译器然后汇编器生成机器码和变量地址。地址可以是绝对的,也可以是可重定位的。当加载程序将它们放入内存段或当它们在内存中时,地址必须是固定的。 constexpr 所说的只是你可以在编译时评估这些东西,是的,你可以。有一个地址。有一个价值。机器代码或可执行代码将在后台使用基于操作系统新偏移量的地址逐字更新。程序员不再担心 16 位真实系统上的绝对寻址。程序员只需要知道这个过程是如何工作的。

数组在内存中是连续的,因此即使使用相对寻址,它们之间的距离也将是 N 个字节....一个非常恒定的表达式确实大声笑