编译的静态性
来源:互联网 发布:微商城 淘宝客 编辑:程序博客网 时间:2024/04/29 14:47
在C++中对于以下语句:
// 全局域
int i = 3;
int j = i;
编译时将i 放入.data 段,设置其值为3.
而对于j ,编译器遇到这种语句,只知道j = i ,由于 i 是变量,不是常量,编译器无法在编译时直接得到它的值,编译器只会找到i 的地址, 然后读取这个地址的内容,再把这个内容写入 j 的地址。
编译器不能够直接用3 来初始化 j ,因为计算机不是人,不懂简单的人类逻辑,我们想“因为 i = 3,而 j = i,所以j = 3",而计算机无法在逻辑上由i = 3 和 j = i 来推出j = 3,就好像图灵机不可能证明某个论题的真伪一样。
计算机只会“取 i 的地址,把3 放到 i 的地址中,取 i 的地址,读取这个地址中的内容,取 j 的地址,把这个内容 写入j 的地址。” 它不会思考,不懂因果,只是机械地执行指令。编译器无法在编译时求得一个非常量的值,它只能在运行时通过读取变量地址来间接得到变量的值,而全局变量在编译时就必须确定其值,故C有静态存储区数据必须用常量初始化的规定。
在编译时只能用常量去初始化一个静态存储区的数据,而不能用“读取某个变量的内容”来初始化,所以编译器会将j 放入 .bss段,默认值为0 ,然后添加一条语句在运行时读取i 的值,再赋给j。这条语句在调用main()之前完成。
// 全局域
int i = 3;
int j = i;
编译时将i 放入.data 段,设置其值为3.
而对于j ,编译器遇到这种语句,只知道j = i ,由于 i 是变量,不是常量,编译器无法在编译时直接得到它的值,编译器只会找到i 的地址, 然后读取这个地址的内容,再把这个内容写入 j 的地址。
编译器不能够直接用3 来初始化 j ,因为计算机不是人,不懂简单的人类逻辑,我们想“因为 i = 3,而 j = i,所以j = 3",而计算机无法在逻辑上由i = 3 和 j = i 来推出j = 3,就好像图灵机不可能证明某个论题的真伪一样。
计算机只会“取 i 的地址,把3 放到 i 的地址中,取 i 的地址,读取这个地址中的内容,取 j 的地址,把这个内容 写入j 的地址。” 它不会思考,不懂因果,只是机械地执行指令。编译器无法在编译时求得一个非常量的值,它只能在运行时通过读取变量地址来间接得到变量的值,而全局变量在编译时就必须确定其值,故C有静态存储区数据必须用常量初始化的规定。
在编译时只能用常量去初始化一个静态存储区的数据,而不能用“读取某个变量的内容”来初始化,所以编译器会将j 放入 .bss段,默认值为0 ,然后添加一条语句在运行时读取i 的值,再赋给j。这条语句在调用main()之前完成。
0 0
- 编译的静态性
- QT的静态编译
- gcc 的静态编译
- 静态库的编译
- JAVA的动态编译和静态编译
- 静态编译与动态编译的区别
- 静态编译与动态编译的区别
- 静态编译与动态编译的区别
- 静态编译与动态编译的区别
- busybox动态编译静态编译的区别
- 动态编译和静态编译的区别
- 静态变量的编译过程
- jni 静态库的编译
- apache的静态/动态编译
- Androidjni 静态库的编译
- 关于Qt的静态编译
- Androidjni 静态库的编译
- qt 静态库的编译
- 南北棋牌游戏大不同,我就爱玩南方棋牌
- JS 简易控制台插件
- USB枚举过程详细分析
- aul 学习测试(测)
- 4.1.1 A - Calendar(简单线性表)(日期查找)(数组应用)
- 编译的静态性
- CF#256(Div.2) A. Rewards
- PL/SQL 之 sql语句的编写
- Android_app项目开发步骤总结
- eclipse package,source folder,folder区别及相互转换
- crm查询记录共享给了哪些人
- [c++11] 判断某类是否有某个原型及名称的成员函数
- STM32F10x的LCD(ILI9320)显示
- HashMap 的遍历key与value的方法