为什么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雪花飞动的效果,确实非常引人入胜,我相信大家也跟我一样看着心动的同时,也很好奇,想研究下代码如何实现:虽然哦很多地方也能下载这些源码,不过也不知道别人制作此类动画时的思路及难 ...
随机推荐
- 阅读MDN文档之布局(四)
Introducing positioning Static positioning Relative positioning Introducing top, bottom, left and ri ...
- 【廖雪峰老师python教程】——装饰器
装饰器 # 一个函数装饰器的列子 def log(func): def wrapper(*args,**kwargs): print('Name=%s'%func.__name__) return f ...
- 「题目代码」P1029~P1033(Java)
1029 C基础-求解方程 import java.util.*; import java.io.*; import java.math.BigInteger; public class Main { ...
- selenide UI自动化进阶二 pageObject实现页面管理
首先定义登录页面,上代码吧 LoginPage.java package com.test.selenium.page; import org.openqa.selenium.By; import s ...
- POI HSS 合并重复的列
import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; i ...
- python 基础篇 04(列表 元组 常规操作)
本节主要内容:1. 列表2. 列表的增删改查3. 列表的嵌套4. 元组和元组嵌套5. range 一. 列表1.1 列表的介绍列表是python的基础数据类型之一 ,其他编程语言也有类似的数据类型. ...
- 安装一台Linux练习机前的考虑——主机规划与磁盘分区
要安装一台Linux主机并不是那么简单的事,我们必须要针对distributions的特性.服务器软件的能力.未来的升级需求.硬件扩充性需求等来考虑,对于磁盘分区.文件系统.Linux操作较频繁的目录 ...
- 软工实践 - 第二十七次作业 Beta 冲刺(5/7)
队名:起床一起肝活队 组长博客:https://www.cnblogs.com/dawnduck/p/10134471.html 作业博客:班级博客本次作业的链接 组员情况 组员1(队长):白晨曦 过 ...
- JVM(1)——简介
网上流传着一段挺有意思的话-- 对于从事C或C++的开发人员来说,他们既是内存管理的最高权力的皇帝,也是最基础的劳动人民,担负着每一个对象生命开始到终结的维护工作,有点光杆司令的赶脚. 但对于java ...
- css 3 filter
css 3 filter image & PS effect https://api-platform.com#COMPANIES