为什么VS没有提供平win64程序编写项
最近在学习C++和MFC编程,突然有个疑问,为什么每次新建项目时,都只有win32 console application,从来没见过win64的选项,于是去网上查了查,下面是我找到的几个答案:
作者:仲唐
链接:https://www.zhihu.com/question/20370633/answer/16422813
-------------------------------------------------------------------------------------
1、指针占用空间变大,cpu的cache size不变,会带来性能问题。
2、对VS团队来说,移植到64bit最好办法是把native code移植到managed code。但这样成本太高。
对于一个IDE,与其移植到64bit以使用4GB内存,不如把精力花在优化内存使用上。
3、VS现有的extension都是32bit的,64bit需要重新建立生态系统。
-------------------------------------------------------------------------------------
作者:红伞菌
链接:https://www.zhihu.com/question/20370633/answer/15526209
-------------------------------------------------------------------------------------
首先,从性能的角度来看,64位需要庞大的指针,因此造成的数据结构更具规模,但处理器高速缓存大小保持不变的情况下,这容易导致运行速度变得极慢。
举个例子,好比你自己挖了一个洞,然后你通过使用额外的4G以上内存来把自己再刨出来然后继续做自己要做的事情。在Visual Studio中,可能会存在一些大规模计算的解决方案,但我认为维护一个环境一个最好的tradeoff是只使用较少的内存。很多的VS的算法是适合的。effectiveness和efficiency比fashion和fabulous要好得多。
下面列出64位的优劣:
from http://blogs.msdn.com/b/joshwil/archive/2006/07/18/670090.aspx
Pluses:
- more memory (+++++)
- better 64-bit math (+++)
- X64 OS kernel takes advantage of more memory to do good things for a lot of stuff (+++)
Minuses:
- things need more memory (pointers are bigger, and especially in managed code references are everything and are everywhere) (--)
- the processor's cache is effectively smaller (when comparing against the same machine in 32-bit vs 64-bit mode) because of the prior point (----)
- code also tends to be bigger because of extra prefix bytes and instructions that carry around 8-byte immediate values instead of 4 byte immediate values
其次,性能问题,从成本的角度来看,如果要全部从已有的32位移植到64位,最短的路径可以是先移植大部分保证增量开发的代码,然后移植那些剩余的,不是那么重要的那些。然而本机代码的完整移植的成本将是相当高的,而且当然所有已知的扩展将被破坏。我们还要创建一个64位的生态系统,这非常像你部署一次全新的64位驱动程序。
更麻烦的,如果所有你想要做的是将64位的代码移植而并非重新开发,最方便的路径确实是直接点对点移植。但是,这种情况根本不可能!!!在实践中,移植是有很大机会成本的,它与M¥ sorry不是,M$其他的业务竞争时间和资源。因此,情况是更可能是这样的:微软的32位C++团队说“我想要往里添加一个OOXX功能,如果我基于已有的环境里开发新的,我可以更容易的做出功能OOXX,并且加上其他的东西比如OOOXXX特效,比如OOOOXXXX的连续自动化量产方案,这样,OOOXXX,OOOOXXXX的成本就很低了“,这也是他们喜欢托管代码原因。
但现在,他们也有64位的一个path。在现实中就变成有是越来越多的Visual Studio版本而不仅仅是32和64两种。所以基于以上考虑,我感觉最好部署VS的方法就是微软想出的策略,使用64位系统运行32位模拟模式的VS,这可以增加一倍可用空间而且不会导致空间问题,并且你也有了64位开发环境。
尽管如此,我知道肯定有很多用户会更加受益于64位的版本,但其实,我觉得,更好的做法不是简单的移植,而是努力优化IDE现有的结构,以图可以更好地减少内存占用。
下面回答一些更详细的问题,
1. 移植成本高是不是因为老代码质量差?
差的只是一小部分,VS太大了对于人类来说。而且大部分软件包都不会有64位地址优势。而且绝大部分的软件算法并没有优化,更有甚者许多继承了效率很低的代码占用了很大的空间,这不是微软自己能解决的。所以移植成64位以后微软也就要跟开发者们说拜拜了。
2. 64位程序出错就会少么?page faults。。。
不是的,64位进程的地址空间反而会引起更多问题 因为你数据块多了,地址多了,很多棘手的问题就接踵而来。然而一个64位的系统则会使问题迎刃而解,假设你在一个64bit OS上运行一个32位程序,你得到的使整个4GB空间,即使你不是直接使用那些64位指针,操作系统自己会判断。你的硬盘缓存会变得很小,即使你有很多其他程序也在运行。比如你的瞬态组件和数据都跑物理内存里了而非占用地址空间。
增加地址空间的真正意义在于允许你分配更多内存,但如果本身已经适应了4GB地址的程序你再把它的指针加大,那问题就来了,你会发现它有多少内存吃多少。别忘了cache大小是不变滴。你也许会发现更大的地址空间允许你创建更少的分区,更多的共享空间,但是auto-relocates这个东西会做得更好。也许更多得指令集是移植得又一好处吧。所以移植的好处就仅仅变成当系统无法再适应4G了,但那个时候你是觉得这个系统还tm能用么?回去用UNIX算了。
有一些必须使用庞大数据处理比如“复共线性空间数据回归模型挖掘”,那另当别论了。估计很少人会经常使用吧。所以即便只支持32位显得不是那么fashion,但是我们做产品要力求—— 简,而非减。
3. 但为啥微软很多其他软件都倾向于部署64位?比如OFFICE2013...
首先,OFFICE的根本问题不应是确保新的代码能运行的很流畅,而是要力求新的文件格式在新的代码生成这些文件时候,要和之前的版本兼容,(之后的版本也是)。所以记住,现在的64位word就应当想到:“我有很多数据结构有了64位偏移”。毕竟几乎所有的二进制文件格式都会有指针尺寸问题,然而Office已经解决了这一难题,使用了压缩格式的XML,所以他们可能已经不用内嵌指针了。
其次,像是EXCEL之类的,很多处理文档的人原因导入大于4G的data,但是想象一下你什么时候需要让VS也处理这么大的数据呢?你如果处理那些大的分析系统,你就安装一个64位的分析调试工具包即可。
One more thing,至今我还是认为32位系统已经足以适合各种开发和使用,64位尽管有那么那么多的好处,它根本上(用户方面)把许多不应该存在的问题复杂化了,所以 你尽管用你的32位,让别人说去吧。
-------------------------------------------------------------------------------------
为什么VS没有提供平win64程序编写项的更多相关文章
- 基于DCMTK的DICOM相关程序编写攻略
2008年09月10日 星期三 15:35 基于DCMTK的DICOM相关程序编写攻略 前言: 由于现在的医学影像设备的图像存储和传输正在逐渐向DICOM标准靠拢,在我们进行医学图像处理的过程中,经常 ...
- .NET 开源了,Visual Studio 开始支持 Android 和 iOS 程序编写并自带 Android 模拟器
.NET 开源了,Visual Studio 开始支持 Android 和 iOS 程序编写并自带 Android 模拟器 北京时间今天凌晨的 Connect(); 大会上,多少程序员的假想成为现实. ...
- python程序编写简介
语句和语法 # 注释 \ 转译回车,继续上一行,在一行语句较长的情况下可以使用其来切分成多行,因其可读性差所以不建议使用 : 将两个语句连接到一行,可读性差,不建议使用 : 将代码的头和体分开 语句( ...
- Mathcad 是一种工程计算软件,主要运算功能:代数运算、线性代数、微积分、符号计算、2D和3D图表、动画、函数、程序编写、逻辑运算、变量与单位的定义和计算等。
Mathcad软件包Mathcad是由MathSoft公司(2006 年4 月被美国PTC收购)推出的一种交互式数值计算系统. Mathcad 是一种工程计算软件,作为工程计算的全球标准,与专有的计算 ...
- 13. 从0学ARM-Cortex-A9 RTC裸机程序编写
一.RTC RTC(Real-Time Clock) 实时时钟. RTC是集成电路,通常称为时钟芯片.在一个嵌入式系统中,通常采用RTC来提供可靠的系统时间,包括时分秒和年月日等,而且要求在系统处于关 ...
- 14. 从0学ARM-exynos4412-看门狗裸机程序编写
看门狗 一.概念 看门狗的简称是WDT(Watch Dog Timer),exynos4412scp中的看门狗定时器(WDT)是一种定时装置. 1. 工作原理 由(一般需要客户编写)软件读写定时器相关 ...
- 20151009 C# 第一篇 程序编写规范
20151009 程序编写规范 1. 代码书写规则: 1).尽量使用接口,然后使用类实现接口. 2).关键语句写注释 3).避免写超过5个参数的方法,如果要传递多个参数,则使用结构 4).避免代码量过 ...
- Android Camera 相机程序编写
Android Camera 相机程序编写 要自己写一个相机应用直接使用相机硬件,首先应用需要一个权限设置,在AndroidManifest.xml中加上使用设备相机的权限: <uses-per ...
- HTML5 canvas绘制雪花飘落动画(需求分析、知识点、程序编写分布详解)
看到网上很多展示html5雪花飞动的效果,确实非常引人入胜,我相信大家也跟我一样看着心动的同时,也很好奇,想研究下代码如何实现:虽然哦很多地方也能下载这些源码,不过也不知道别人制作此类动画时的思路及难 ...
随机推荐
- android中的文件(图片)上传
android中的文件(图片)上传其实没什么复杂的,主要是对 multipart/form-data 协议要有所了解. 关于 multipart/form-data 协议,在 RFC文档中有详细的描述 ...
- js滚动及可视区域的相关的操作
element.getBoundingClientRect 判断指定元素相对于页面可视窗口的位置信息,通常结合windows.onScroll方法使用,当element.getBoundingClie ...
- Ruby中数组的&操作
最近在忙一个项目,好久没有写日志了,项目终于接近尾声,可以适当放松一下,所以记一下在这个项目中发现的有趣事情: 数组的 与 操作 一直以为两个数组A和B相与,谁前谁后都一样,不过这次在项目中突然想试一 ...
- c++调用Python基础功能
c++调用Python首先安装Python,以win7为例,Python路径为:c:\Python35\,通过mingw编译c++代码.编写makefile文件,首先要添加包含路径:inc_path ...
- sql 条件插入
原普通插入语句: insert into seriestable_upload values(New.SeriesID,0); 加条件后:(当不存在该条数据插入) insert into custom ...
- chrome谷歌浏览器导致的密码被修改现象
版本 68.0.3440.106(正式版本) (32 位)记住密码功能有个缺陷,会把自己的密码自动填写到别人的密码框中,假如这个时候点击保存密码,就会导致其他用户的密码被修改为登录用户的密码. 很 ...
- Vue.js---组件
详情点此连接(转载) 组件的创建和注册 vue.js的组件的使用有3个步骤:创建组件构造器.注册组件和使用组件. 1. 调用Vue.extend()方法创建组件构造器. 2. 调用Vue.compon ...
- P2P(WFD)之RegClass *****************************TBD
三个Action Frame的IE会有带上RegClass的信息 Listen Channel element, Channel List element, Operation Channel ele ...
- 算法(2) Find All Numbers Disappeared in an Array
题目:整数数组满足1<=a[i]<=n(n是数组的长度),某些元素出现一次,某些元素出现两次,在数组a[i]中找到[1,n]区间中未出现的数字.比如输入[4,3,2,7,8,2,3,1], ...
- Delphi中取得程序版本号
Delphi做的程序,如果想包含版本信息, 必须在Delphi的集成编辑环境的菜单“Project/Options/Version Info”里面添加版本信息.即在Version Info 选项卡中选 ...