常量折叠 const folding
http://bbs.byr.cn/#!article/CPP/86336?p=1
下列代码给出输出结果:
#include"stdafx.h"
#include <iostream>
#include "stdlib.h" using namespace std;
int main(void)
{
const int a = ;
int * p = (int *)(&a);
*p = ;
cout << "a = " << a << ", *p = " << *p << endl;
cout << &a << endl << p << endl; //本人测试时添加的
system("pause");
return ; }
运行结果如下:
--
可是在vc2013中编译通过,运行正常。而且是多次运行。
运行结果a=10,a的值没被修改,可是指针P指向的确是a的地址,而对*P赋值20后,a的值居然没变。、
而且*P的值为20.那么P指向的内存在哪里?
从运行结果来看:*P和a的地址是一样的,那么为什么从同一地址中取出的值却不一样?
此题选项为:
A、编译时出错
B、编译正常,运行时出错
C、a=10,*P=10
D、a=10,*P=20
E、a=20,*P=10
F、a=20,*P=20
几个选项都不对。
所谓的“undefined behaviour”意思是语言的实现(包括编译器、运行库什么的)做任何事都可以。所以,vc2013能编译通过,而且给出某种“正常”的结果,都是允许的,因为编译器允许做任何事。
之所以会这样,是因为检查错误是有代价的,有时候,为了给出确定的行为,甚至是让程序运行时出错,都会让正确的程序的运行的效率大打折扣。比如,“取a的指针”不是错误,因为就算取了指针,以后也可能只是读而不写;“向*p里赋值”也不是错误,因为指针可以指向只读空间也可以指向读写空间,所以不便于编译时检查。所以,C语言的标准里干脆将其规定为“未定义行为”。它隐含的意思是:既然编译器、运行库做什么事都可以,那么程序员就必须尽一切努力来避免这样的事发生。所以,程序员如果写这样的程序,就是程序员的过失。
希望阿里的生产环境的应用里没有这样的代码。如果他们依赖于某种“特定的未定义行为”,你就该换个老板了。
还是注意“语言”和“语言实现”的区别。
“语言”(C++)规定,const标注的存储空间不可以被赋值,如果赋值就是“未定义行为”;但“语言的实现”(VC、x86处理器、Windows系统)可以在语言的要求内,翻译成任何样子。“把栈内存定义为可读写的”是编译器和系统的选择,而不是C++语言的要求。你可以说,“我的这个程序,这次在运行于x86处理器的Windows系统上用这个版本的VC2013编译,得到的这个可执行文件给这个局部变量a分配了栈上的读写空间”,但不能说同样的源代码在别的编译器、系统会有同样的行为。
总结:常量折叠说的是,在编译阶段,对该变量进行值替换,同时,该常量拥有自己的内存空间,并非像宏定义一样不分配空间,需澄清这点
http://blog.csdn.net/yby4769250/article/details/7359278
常量折叠 const folding的更多相关文章
- C++高级进阶 第四季:const具体解释(二) 常量折叠
		一.文章来由 const具体解释之二 二.const 取代 #define const最初动机就是取代 #define. const 优于 #define: (1) #define没有类型检查,con ... 
- const常量折叠
		首先来看一个例子: int main(int argc, char* argv[]) { ; int *j = (int *) &i; *j=; cout<<&i<& ... 
- const常量,常量折叠,字面常量
		const int a=10: 涉及到一个叫常量折叠的概念(认为我这说得太简单或者不好理解的可以google一下它获取更多信息), 即编译器虽然会给a分配空间(如果取a的地址进行操作的时候,会强迫编译 ... 
- C++中的常量折叠
		先看例子: #include <iostream> using namespace std; int main() { ; int * p = (int *)(&a); *p = ... 
- C++的常量折叠(二)
		前面的C++的常量折叠(一)的最后留下了一个问题,那就是在声明i的时候,加上修饰符volatile关键字,发现结果输出的就不一样了,下面来说一下volatile这个关键字. C/C++中的volati ... 
- C++的常量折叠(一)
		前言 前几天女票问了我一个阿里的面试题,是有关C++语言的const常量的,其实她一提出来我就知道考察的点了:肯定是const常量的内存不是分配在read-only的存储区的,const常量的内存分配 ... 
- Python优化机制:常量折叠
		英文:https://arpitbhayani.me/blogs/constant-folding-python 作者:arprit 译者:豌豆花下猫("Python猫"公众号作者 ... 
- 在php中定义常量时,const与define的区别?
		问]在php中定义常量时,const与define的区别? [答]使用const使得代码简单易读,const本身就是一个语言结构,而define是一个函数.另外const在编译时要比define快很 ... 
- 面试集锦-常量,const, const 对指针的影响
		在C语言中不可改变的数据(量)就是常量 在C语言中有三种常量 字面量(直接量),就是直接写出来的,从写法上就可以看出值与类型等,例如:19,123.456等 名字常量 ... 
随机推荐
- 【原】SBT构建Scala应用
			[转帖] 原文地址:https://github.com/CSUG/real_world_scala/blob/master/02_sbt.markdown 尊重版权,尊重他人劳动成果,转帖请注明原文 ... 
- ContactsContract.CommonDataKinds【Translated By KillerLegend】
			http://developer.android.com/reference/android/provider/ContactsContract.CommonDataKinds.html interf ... 
- sliding windows (poj 2823) 题解
			[问题描述] 给你一个长度为N的数组,一个长为K的滑动的窗体从最左移至最右端,你只能见到窗口的K个数,每次窗体向右移动一位,如下表: [样例输入] 8 3 1 3 -1 -3 5 3 6 7 [样例输 ... 
- 第一节:CLR寄宿
			本系列文章来自 CLR VIA C# .NET FrameWork在Microsoft Windows平台的顶部运行.这意味着.NET必须用Windows可以理解的技术来构建.首先,所有的托管模块和 ... 
- iOS反射机制
			iOS属性反射:说白了,就是将两个对象的所有属性,用动态的方式取出来,并根据属性名,自动绑值.(注意:对象的类,如果是派生类,就得靠其他方式来实现了,因为得到不该基类的属性.) 本人常用的反射方式,有 ... 
- Collection中的排序
			我们来了解一下Collection的框架与接口: Set接口下面已经有SortedSet接口,其中提供了很多自带排序的实现类,例如ThreeSet,用户还能够自定义比较器来规定自己的排序规则. 本篇着 ... 
- [Letcode] 1. Two Sum
			Given an array of integers, return indices of the two numbers such that they add up to a specific ta ... 
- [原创]PostgreSQL Plus Advanced Server监控工具PEM(一)
			一.概述 PEM是为数据库管理员.系统架构师和性能分析师为管理.监控和优化 PostgreSQL 和 EnterpriseDB 数据库服务器设计的图形化管理工具.旨在解决大量数据库服务器跨地域.精细化 ... 
- go语言示例-Timer计时器的用法
			计时器用来定时执行任务,分享一段代码: package main import "time" import "fmt" func main() { //新建计时 ... 
- 推荐:一个个人开发者搞app赚钱之后的总结!有图有真相。
			2011年已经过去了,回顾2011有收获,更有许多不足.收获就是了却了一件人生大事(女儿出生),还有就是算入门了android并利用它开发 了一 款还算有些许收获的应用.不足的地方是单位工作上没有太好 ... 
