繁体   English   中英

c ++ 11中的constexpr概念

[英]constexpr concept in c++11

我将通过C ++中的constexpr概念。 我的理解是constexpr在编译时得到评估。 这里 ,我找到了一个示例,他们有以下代码段。

int z[30];

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

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

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

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

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

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

正如Passer By所指出的那样,根据标准( 7.6.6 Additive operators ,last sentence),这是未定义的行为:

除非两个指针指向同一个数组对象的元素,或者指向数组对象的最后一个元素,否则行为是未定义的。

编译器不需要知道地址的实际值。 它采用简单的指针算法。 由于z是整数数组,因此在数组中减去两个整数地址将产生下标之间的差异。

所以

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

将导致将值17分配给e2。

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

数组在内存中是连续的,因此即使使用相对寻址,其间的距离也将是N个字节....一个非常常量的表达式确实lol

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM