| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3229 人关注过本帖
标题:深入指针笔记二
只看楼主 加入收藏
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 38楼 pangding
应该是 C不对初始化的const常量(哎 现在都不知道称它为常量好还是变量好了 )进行常量折叠
C++对能进行常量折叠的 const常量就进行折叠 无法折叠的就可以通过强制方式取这个const常量的地址来改变它。
这个结论不知道对否?

[ 本帖最后由 有容就大 于 2012-7-28 19:55 编辑 ]

梅尚程荀
马谭杨奚







                                                       
2012-07-28 19:54
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
回复 35楼 有容就大
现在的操作系统有进程地址空间的概念。每个进程都独享全部的地址空间(比如 32 位的系统就是 4G),然后由页表控制地址的映射。
所以在一个同一个地址值,对于不同的进程一般不是指同一个地址。被装载的页有会被标记,不属于这个空间的地址值被访问到会产生页不存在错误。而装载了的页,会映射到自己的地址空间里。所以不同的进程是极难以简单的方式交互的,因为它们感觉不到其它进程的存在,这才产生了进程间通信这个概念。
2012-07-28 19:57
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
回复 41楼 有容就大
我没听过常量折叠这个概念。
2012-07-28 19:59
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
以下是引用pangding在2012-7-28 19:57:52的发言:

现在的操作系统有进程地址空间的概念。每个进程都独享全部的地址空间(比如 32 位的系统就是 4G),然后由页表控制地址的映射。
所以在一个同一个地址值,对于不同的进程一般不是指同一个地址。被装载的页有会被标记,不属于这个空间的地址值被访问到会产生页不存在错误。而装载了的页,会映射到自己的地址空间里。所以不同的进程是极难以简单的方式交互的,因为它们感觉不到其它进程的存在,这才产生了进程间通信这个概念。


确切的说 对于x86体系 采用段 选择子机制和页表机制实现逻辑地址到物理地址的转换
2012-07-28 20:00
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 43楼 pangding
呵呵 网上看的
网上人们普遍反映thinking in c++将const folding译为常量折叠是种误导,我觉得译的还行,本来folding就有折叠的意思,就是把原来的东西变小,而象const int i = 2*2;编译器确实将2*2算成4了,以后碰到i就用4替换,这个计算2*2的过程据说叫常量折叠--const folding,而用4替换i的过程叫做复写传播--copy propagation.他们都是编译器的优化技术


但是如 const int i = test(); 就无法折叠。


梅尚程荀
马谭杨奚







                                                       
2012-07-28 20:06
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
以下是引用pangding在2012-7-28 19:57:52的发言:

现在的操作系统有进程地址空间的概念。每个进程都独享全部的地址空间(比如 32 位的系统就是 4G),然后由页表控制地址的映射。
所以在一个同一个地址值,对于不同的进程一般不是指同一个地址。被装载的页有会被标记,不属于这个空间的地址值被访问到会产生页不存在错误。而装载了的页,会映射到自己的地址空间里。所以不同的进程是极难以简单的方式交互的,因为它们感觉不到其它进程的存在,这才产生了进程间通信这个概念。


确切的说 对于x86体系 采用段 选择子机制和页表机制实现逻辑地址到物理地址的转换
=============================================================================
呵呵 越说越深了啊

梅尚程荀
马谭杨奚







                                                       
2012-07-28 20:08
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
回复 44楼 zklhp
膜拜汇编大牛。不过其实我也只知道 x86 这个架构的东西,linux 内核为了能移植到各个平台,需要写好多平台的底层代码。不过除了 x86 架构下的汇编,其它的我也看不懂。
2012-07-28 20:09
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
回复 45楼 有容就大
哦,你说那个是优化策略的名字。嗯,是叫 constant folding,我头一次看见中文翻译。在 gcc 的手册里能查着。我一般都记不住这些东西。
2012-07-28 20:11
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
以下是引用有容就大在2012-7-28 19:37:11的发言:

那如果是一个个进程想要保护一个数据 把他存在常量区 会不会在同时就通知操作系统 : 别让别人来修改我要保护的数据! ? 从而操作系统就禁止一切进程妄图去修改它。

Windows在NT之后,才开始保护进程,每个进程是独立的虚拟地址空间,操作系统负责映射和保护,各个进程是互不干扰的,这样才使得NT以后的Windows稳定下来。此前版本的Windows,仍然与DOS一样,可以用真实地址访问的。虽然如此,进程之间通讯仍然是现实需求,Windows也提供了API满足这种需求,但一切在Windows调度之下,不是程序自己可以控制的。事实上,Windows下的所有程序,及其所有函数,都不是自己运行的,而是Windows系统适时调用的,这种程序模式,与DOS时代教人们认识的截然相反,所以现在的.EXE和.DLL,根本没有区别,它们都是“程序集”,在Windows眼中,不管你怎么打包,都仍然是散的,Windows需要什么就从中提取什么,不到你程序作主。不同操作系统下的编译器,把程序编译出来之后,模式完全不同,只不过在源代码级别上你看起来可移植性很强罢了。尽管你现在编写的代码可以是旧式的代码,比如TC for Windows下面那样的代码,只是源代码不变而已,但编译器已经把这些代码用完全不同的方式重新实现了,是必须能在Windows下执行的模式,所以你学TC的观念,实际上编译器骗了你也不知道,还以为那种模式真的可行。Unix之类,也是有不同的模式的,具体它怎么处理语言的实现,是另外不同的事情。也就是说,现在不要再像以前那样,对底层太过关心,API是中间层,它掩盖了实现的细节,向你呈现一致的编程界面,你只管使用这种高级界面就是了,除非你决定要做中间层,否则技术触角无需伸到那里,了解大概原理,知道有那么一回事就是了。比如现在在.NET中,连Win32的API都封装了统一的高级界面(类)供你使用,这个时候,还去钻研Win32 API,反而把事情弄复杂,须知系统底层API随时会变,但封装后的.NET类库高级界面是会尽力维持的,你不必跟着底层永远地变,那也与你无关。

语言提供const修饰符,是让程序员使用的。如果你的业务逻辑确定某个数据应该是不可变的,就把它声明为const,那么编译器会辅助你提防偶然出现的误写行为,是帮助你写无错代码的。但若你要刻意突破这种防线,非要试图去改这种数据不可,事实上也拦不住,不过,这与你自己逻辑上要求此数据不可修改的意图相悖,是你自己在为难自己——既然你有意识地去改它,就不必声明为const,就那么简单。

[ 本帖最后由 TonyDeng 于 2012-7-29 00:54 编辑 ]

授人以渔,不授人以鱼。
2012-07-29 00:53
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 49楼 TonyDeng
也就是说const修饰符并不是想的那么厉害,也可能被修改。这算
不算一个C语言的漏洞,我自己是无意修改,但保不齐别人利用这个
漏洞来捣乱。

梅尚程荀
马谭杨奚







                                                       
2012-07-29 09:43
快速回复:深入指针笔记二
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.013258 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved