龙之谷吧 关注:2,660,884贴子:93,562,809

(硬核)关于64位程序的一些科普

只看楼主收藏回复

开篇
这里先用一个不太恰当的比喻来描述一下32位和64位的区别
原来有个小孩数数,他只能数到5,为什么呢?因为他只会数一只手的手指头。所以他对超过5个的东西都没法接受,想不通。突然有一天,这小孩的脑瓜开窍啦(cpu升级),会用两只手数数了,现在他终于可以数到10了!
这就是32位和64位的本质区别,一次性能数的数多了。原先32位要表示内存地址,只能表示4G,所以说超过4G的内存都是没法直接访问的。但是64位不同,它能表示的内存地址是最大可以达到1677216TB(实际上由于CPU寄存器问题,目前系统只能用到2的48次方大小内存),目前大多数用户用的都是8G或者16GB内存起步。可以说64位的出现可以满足人类短时间内可预见未来的所有需求了。


IP属地:陕西1楼2021-01-20 11:14回复
    软件方面
    1.32位程序和64位程序的区别
    首先我们要搞明白一点,程序的源代码是没有32位和64位一说的。那么决定32位程序和64位程序的区别是什么呢?就是软件编译器。
    这里我们要讨论一下一个软件是如何被执行的。
    一个源程序首先需要被预处理,寻找头部文件和依赖文件,然后被编译成目标文件。但是目标文件是没有办法直接运行的,这时候就需要依赖操作系统提供的动态链接库(dynamic linked library,也就是我们常说的dll文件),对目标文件进行链接,形成可执行文件(也就是我们常说的exe文件了),就能够在我们的操作系统中执行了。
    上述过程中有几个非常重要的地方
    (1)动态链接库
    (2)系统API
    首先32位操作系统上一般是没有64位的库文件的。如果你的应用程序源码中引用了64位链接库中才有的函数等,那么链接会直接提示错误。反之,64位操作系统基本都向后兼容32位链接库,所以64位操作系统能编译32位软件,也能编译64位软件。


    IP属地:陕西2楼2021-01-20 11:15
    回复
      2. 对于程序开发者要干什么
      32 位和 64 位编译环境之间最大的不同之处在于数据类型模型的变化。32 位应用程序的 C 数据类型模型是 ILP32 模型,如此命名是因为 int 类型、long 类型和指针都是 32 位数据类型。64 位应用程序的数据类型模型是 LP64 数据模型,如此命名是因为 long 和指针类型变成了 64 位。其余的 C 整数类型和浮点类型在这两种数据类型模型中相同。
      当前的 32 位应用程序通常假设 int 类型、long 类型和指针大小相同,在内存中占用4个字节。但是在 LP64 数据模型中,long 和 pointer 的大小发生了变化,在内存中占用8个字节。这种变化正是导致 ILP32 到 LP64 转换问题的主要原因。
      如果是老玩家的话(冰龙时代),一定会记得一个BUG,就是剑皇的惩罚给BOSS加血的问题。原因也很简单,就是因为惩罚额外伤害触发了21E上限。稍微学过计算机编程的同学都应该知道,int类型表达的数值范围在-2,147,483,648 到 2,147,483,647之间。超过了 2,147,483,647后,那么就会变成-2,147,483,648,打出来的伤害会变成负数,也就是相当给BOSS加血了。当时的开发者怎么也不会想到,会这么快的突破伤害上限。所以将伤害类型改成unsigned long(long正数)类型了。long表达的数值范围就扩大了很多,变成了-9,223,372,036,854,775,808~9,223,372,036,854,775,807范围之间。
      然而64位的long类型跟32位类型由于字节占用不同,所以实际开发的时候需要修改源码,转换起来相当麻烦。
      这里大家需要明白一点就好:64位程序绝不仅仅是将源码用64位编译器再编译一次而已。


      IP属地:陕西3楼2021-01-20 11:15
      回复
        对于用户而言
        对于用户来说,首先要搞清楚的一点的是:64位仅仅只是解决了内存空间的瓶颈。最终软件运行效率,还是取决于CPU、内存、硬盘诸多方面。
        软件编译成64位以后,并不一定比32位程序运行速度快。事实上很多开发者把程序从32位转成64位的时候,只是用编译器进行编译做了兼容,并没有对64位程序的一些特性进行优化。我想龙之谷也基本不太会对这些特性进行优化(毕竟人少)
        但也不是说64位软件一无是处。以前32位软件只能用到4个CPU寄存器,但是64位程序可以使用自带的4个32位寄存器,和8个可拆分的64位寄存器。举个简单例子:如果一个函数需要12个变量,在32位系统一次只能加载4个变量到寄存器,要加载3次,那样会导致频繁的内存交换。降低效率。而64位程序就可以一次性把这些变量全部塞到寄存器中一起执行,这样就不需要进行内存交换了。也就极大提高了运行效率。


        IP属地:陕西4楼2021-01-20 11:16
        回复
          写了这么多,有啥不足之处,还希望各位大佬进行指正。


          IP属地:陕西5楼2021-01-20 11:17
          回复
            我是来玩游戏,不是来学数学的


            IP属地:浙江来自Android客户端6楼2021-01-20 11:25
            回复
              大家其实只关心结果,64位相对于32位的优缺点有哪些,其他东西都太专业了


              IP属地:上海来自Android客户端7楼2021-01-20 11:39
              收起回复
                科普到谷迷玩家人均开发一款龙之谷然而现在的人只是想知道64比32位帧率能提升多少百分比,毕竟很多低配甚至顶配都还觉得很卡的


                IP属地:广西来自Android客户端8楼2021-01-20 11:50
                收起回复
                  说人话


                  IP属地:美国来自iPhone客户端9楼2021-01-20 11:53
                  回复
                    一句话:64位比32位快。


                    IP属地:广东来自Android客户端10楼2021-01-20 12:02
                    回复
                      !,


                      来自Android客户端11楼2021-01-20 12:42
                      回复
                        所以我的32G内存玩这龙之谷没什么卵用


                        IP属地:广东来自Android客户端12楼2021-01-20 12:44
                        收起回复
                          隔壁dnf的64位就是飞跃,龙之谷应该不会差


                          IP属地:广东来自Android客户端13楼2021-01-20 12:46
                          回复
                            额,我想问啥时候开


                            IP属地:广西来自iPhone客户端14楼2021-01-20 12:50
                            回复
                              总是报错 求问怎么解决


                              15楼2021-01-20 13:00
                              收起回复