[英]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.