全局变量初始化中的数学运算,机器做什么?

时间:2016-10-24 22:33:35

标签: c++ runtime compile-time

使用" ="右边的数学运算初始化全局变量时,编译器会做什么?登录?

示例:

split(p.expected, ceiling(seq_along(p.pretty)/3))

程序应返回191 =(75 +(32 + 84))

我不知道的是,结果是在编译时还是在运行时计算的

2 个答案:

答案 0 :(得分:2)

32+84是一个"常量表达式",它在C和C ++标准中都是一个术语,本质上是一个算术表达式,其值可以在不需要的情况下计算编译器知道任何变量的值。使用常量表达式初始化全局变量时,如

中所示
int global2=32+84;

从技术上讲,C和C ++标准都不需要在编译时对其进行评估,但是你很难找到一个没有编译的编译器。那样。 (还有其他的上下文,编译器必须在编译时评估常量表达式,所以它必须有代码才能完成它,所以它也可以一直这样做。)

global1+global2不是"常量表达式"。在C中,这意味着它不能用于初始化全局变量;您将收到编译时错误。在C ++中,它是允许的,并且未指定添加是在编译时还是在运行时发生。唯一的保证是global3main开始执行时具有正确的值;特别是,如果从构造函数中观察全局对象,它可能 not 具有正确的值。

(根据经验,g ++ 6在运行时计算global3的值,而clang ++ 3.9在编译时计算它,这证实了在实践中确实发生了两种可能性。)

(在C ++中,如果global1+global2global1已被声明为global2,则{C}中的将被视为常量表达式}。)

答案 1 :(得分:0)

如果您的意思是c ++,我相信global3是在运行时计算的,因为它需要实际执行代码。这称为动态初始化,而c不支持,但我相信c ++可以。 c和c ++都允许静态初始化,这就是global1和2,因为实际值存储在磁盘上。想想这样,如果有人给你一个说你需要糖和盐的食谱,然后你混合然后加入面粉,你是否会在等待使用食谱时储存混合糖和盐?不,你在"运行时"进行混音。但是,你准备购买糖和盐,你只是不要混合它们。糖和盐是全球1和2,混合物是全球3。