常量折叠

关注公众号【高性能架构探索】,第一时间获取干货,回复【pdf】,免费获取计算机必备经典书籍

记得十年前,逛csdn的时候,看到一篇帖子,讲常量折叠的,于是,这个概念就一直在自己脑海中印着,是不是出来蹦跶几下。

今天就将这个概念整理出来,分享给大家,也送给自己。

直奔主题,先看一段代码


#include <iostream>

int main() {
  const int a = 0;
  int *b = const_cast<int *>(&a);
  *b = 1;

  std::cout << "a = " << a << " b = " << *b << std::endl;
  return 0;
}

代码很简单,主要做了以下几件事:

声明一个const 常量a,赋值为0
声明一个int型指针b,指向a的地址
修改b所指向的内存的值
输出a 和 b
第一印象,a和b都是1,因为修改了a的内存,但是

答案却是
0 1
这是为什么呢?我们尝试下输出a和b的地址

std::cout << &a << " " << b << std::endl;

0x7ffe1b01ae54 0x7ffe1b01ae54
很奇怪,地址一样,值却不一样。

这就是我们这篇文章的主题------常量折叠
这个"常量折叠"是 就是在编译器进行语法分析的时候,将常量表达式计算求值,并用求得的值来替换表达式,放入常量表。可以算作一种编译优化。

我只是改了这个地址内容,但是a还是0,

原因:

编译器在优化的过程中,会把碰见的const全部以内容替换掉,这个出现在预编译阶段;但是在运行阶段,它的内存里存的东西确实改变了

版权归作者所有,如需转载请联系作者

(1)
上一篇 2021年12月1日 下午3:10
下一篇 2021年10月14日 下午6:20

相关推荐

发表回复

您的电子邮箱地址不会被公开。