首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 常引用编译器会给分配空间吗? [已结贴,结贴人:hhhtwtt]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hhhtwtt
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 揭帖率:
    发表于:2008-03-10 20:45:03 楼主
    请教一个问题,
    编译器在编译的时候,常引用会分配空间吗?
    如const int& r=1;
    20  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Supper_Jerry
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-03-10 20:50:191楼 得分:0
    会的,有个指针变量(应该是,取决于编译器)。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • healer_kx
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-03-10 20:51:232楼 得分:0
    不会。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hhhtwtt
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-03-10 20:51:273楼 得分:0
    引用 1 楼 Supper_Jerry 的回复:
    会的,有个指针变量(应该是,取决于编译器)。


    能不能解释的再详细一点?还是有点不理解
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • jieao111
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-03-10 20:55:594楼 得分:0
    不会把。。引用的地址也是本值的地址。。。只是一个 假名把。。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Supper_Jerry
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-03-10 20:58:255楼 得分:0
    你如果输出两者地址应该是相同的。
    可是我觉得,从编译器的角度考虑
    是应当有个指针(或者类似的东西)来索引这个常量的。
    个人感觉,学艺不精,莫见怪。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lxjlan
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-03-10 21:24:186楼 得分:0
    我记得是引用是不分配空间的。。。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • fetag
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-03-10 21:25:007楼 得分:0
    不会分配空间,你可输出引用的那个地址看一下就知道了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Chiyer
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 4

      3

      3

    发表于:2008-03-10 21:28:248楼 得分:0
    C/C++ code
    由编译器决定,一般不会分配空间,而是直接生成在指令中 比如 int main() { 0042D740 push ebp 0042D741 mov ebp,esp 0042D743 sub esp,0E4h 0042D749 push ebx 0042D74A push esi 0042D74B push edi 0042D74C lea edi,[ebp-0E4h] 0042D752 mov ecx,39h 0042D757 mov eax,0CCCCCCCCh 0042D75C rep stos dword ptr es:[edi] const int& i = 100; 0042D75E mov dword ptr [ebp-14h],64h 0042D765 lea eax,[ebp-14h] 0042D768 mov dword ptr [i],eax int a = i + 100; 0042D76B mov eax,dword ptr [i] 0042D76E mov ecx,dword ptr [eax] 0042D770 add ecx,64h // 这个100在指令中 0042D773 mov dword ptr [a],ecx return 0; 0042D776 xor eax,eax }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Chiyer
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 4

      3

      3

    发表于:2008-03-10 21:29:239楼 得分:0
    晕,看错了,根据上面的asm,好像会 >_ <
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • arong1234
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-03-10 21:31:5610楼 得分:0
    逻辑上引用是没有占有空间的
    对这种问题不应该去看汇编或者研究编译器,因为不同编译器的实现方式可能是不同的
    高级语言有时需要“务虚”的看,你根据汇编看出的结果,只是一种私有化的实现方式,不代表逻辑上它应该如何。你抓准C++逻辑才是关键
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Chiyer
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 4

      3

      3

    发表于:2008-03-10 21:32:0411楼 得分:0
    release 版就直接写在指令中了


    C/C++ code
    int main() { const int& i = 100; printf("%d", i); 00401000 push 64h 00401002 push offset string "%d" (402104h) 00401007 call dword ptr [__imp__printf (4020A0h)] 0040100D add esp,8 return 0; 00401010 xor eax,eax } 00401012 ret ps :跟编译器相关的东西可以不要深究了 - -
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • arong1234
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-03-10 21:35:3812楼 得分:0
    首先我很怀疑这种所谓的常引用有何意义?常引用一般只在函数调用中出现,用于表示一个现有对象无法被修改。引用本身应该永远指向其他对象,而const int &i =100如果可以编译通过,则应该是指向这个临时变量的引用。这样的引用有何意义?
    即使这样的引用存在,也不能说它占有了额外的地址。占有地址的是它指向的哪个对象的地址,而不是引用自己。逻辑关系一定要弄明白
    int main()
    {
    0042D740  push        ebp 
    0042D741  mov        ebp,esp
    0042D743  sub        esp,0E4h
    0042D749  push        ebx 
    0042D74A  push        esi 
    0042D74B  push        edi 
    0042D74C  lea        edi,[ebp-0E4h]
    0042D752  mov        ecx,39h
    0042D757  mov        eax,0CCCCCCCCh
    0042D75C  rep stos    dword ptr es:[edi]
        const int& i = 100;
    0042D75E  mov        dword ptr [ebp-14h],64h  < <注意,这个ebp-14h不是引用的地址,变量本身是有地址的,这是变量自己的地址
    0042D765  lea        eax,[ebp-14h]
    0042D768  mov        dword ptr [i],eax

        int a = i + 100;
    0042D76B  mov        eax,dword ptr [i]
    0042D76E  mov        ecx,dword ptr [eax]
    0042D770  add        ecx,64h                  // 这个100在指令中
    0042D773  mov        dword ptr [a],ecx
        return 0;
    0042D776  xor        eax,eax
    }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • taodm
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 5

      3

    发表于:2008-03-11 09:04:0913楼 得分:0
    是“不要去关心分配不分配内存”,那是编译器的权利。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • sheenl
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-03-11 09:06:1014楼 得分:0
    重要吗?
    有很多常量, 都是不分配内存的。
    比如说
    const int i = 1;
    这种语句, 很可能就不分配内存。(看你的程序怎么用这个常量了。)
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • z_kris
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-03-11 09:35:1215楼 得分:0
    编译器一般还是通过指针来实现引用机制的
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zhaodongyin
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-03-11 11:50:3116楼 得分:0
    会的
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Rainstorey
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-03-11 11:50:4417楼 得分:0
    占用内存但不分配内存
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ttlyfast
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-03-11 12:47:1518楼 得分:0
    哈哈
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • nicky_zs
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-03-11 12:54:1519楼 得分:0
    不用看汇编代码。你在程序中按顺序分配几个int变量,然后在中间插入一个const int &,然后你把所有的变量的地址打印出来。如果你发现这些地址不是等差数列,那么自然就说明编译器为const int &分配空间了啊。
    记得把const int &绑定到变量、常数、常浮点数上面试试。记得看一下地址的差值。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lauxp
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-03-11 14:11:2420楼 得分:0
    为什么需要分配空间或者为什么不需要分配空间?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • JackyLaura
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-03-11 14:31:2821楼 得分:0
    吸收!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • sp1006
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-03-11 14:32:0922楼 得分:0
    会生成一个临时变量 temp = 1
      &r = temp
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • steedhorse
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 2

      3

      4

    发表于:2008-03-11 14:40:5723楼 得分:0
    用常量初始化常引用,实际是引用到临时变量,所以应该是占用空间的。

    当然,从实际效果来看,在使用情形简单的上下文中(比如没有函数调用、参数传递,也没有取地址等动作),不排除个别编译器优化掉其所需空间的可能性。
    举例来说:
    {
    const int& r = 5;
    int j = r;
    }
    在这种情形下,最终的目标代码中是完全有可能优化掉那个临时变量的,便更复杂的情况又难说了。
    但这种毕竟只是“优化”而已,而优化的程度随编译器不同而不同,而且常常可以用编译选项来人为控制。
    所以讨论优化过于离题了。基本上,答案应该是:“占用空间”。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • antimatterworld
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-03-11 23:54:3624楼 得分:0
    [Quote=引用 8 楼 Chiyer 的回复:]
    C/C++ code
    由编译器决定,一般不会分配空间,而是直接生成在指令中

    比如

    C/C++ code
    int main() { 0042D740 push ebp 0042D741 mov ebp,esp 0042D743 sub esp,0E4h 0042D749 push ebx 0042D74A push esi 0042D74B push edi 0042D74C lea edi,[ebp-0E4h] 0042D752 mov ecx,39h 0042D757 mov eax,0CCCCCCCCh 0042D75C rep st…
    [/Quote]

    得学习汇编了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lexchou
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-03-12 07:25:0525楼 得分:0
    编译器最多只会为常引用分配地址空间,绝对不会分配具体保存数据的空间。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lxjlan
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-03-12 08:41:1926楼 得分:0
    应该要指明这里的分配空间指的是哪里的空间。。。。应该来说,这样的话,应该在代码区存在的,看有没分配应该要考虑下分配空间的位置在哪。。。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • w_anthony
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-03-12 09:33:0227楼 得分:0
    如果去掉优化编译,会分配一个指针的空间,但是由于优化编译的存在,它会根据实际情况决定要不要分配空间。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • liufangbj
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-03-12 09:37:1728楼 得分:0
    学习,飘过