最近在学习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程序编写项的更多相关文章

  1. 基于DCMTK的DICOM相关程序编写攻略

    2008年09月10日 星期三 15:35 基于DCMTK的DICOM相关程序编写攻略 前言: 由于现在的医学影像设备的图像存储和传输正在逐渐向DICOM标准靠拢,在我们进行医学图像处理的过程中,经常 ...

  2. .NET 开源了,Visual Studio 开始支持 Android 和 iOS 程序编写并自带 Android 模拟器

    .NET 开源了,Visual Studio 开始支持 Android 和 iOS 程序编写并自带 Android 模拟器 北京时间今天凌晨的 Connect(); 大会上,多少程序员的假想成为现实. ...

  3. python程序编写简介

    语句和语法 # 注释 \ 转译回车,继续上一行,在一行语句较长的情况下可以使用其来切分成多行,因其可读性差所以不建议使用 : 将两个语句连接到一行,可读性差,不建议使用 : 将代码的头和体分开 语句( ...

  4. Mathcad 是一种工程计算软件,主要运算功能:代数运算、线性代数、微积分、符号计算、2D和3D图表、动画、函数、程序编写、逻辑运算、变量与单位的定义和计算等。

    Mathcad软件包Mathcad是由MathSoft公司(2006 年4 月被美国PTC收购)推出的一种交互式数值计算系统. Mathcad 是一种工程计算软件,作为工程计算的全球标准,与专有的计算 ...

  5. 13. 从0学ARM-Cortex-A9 RTC裸机程序编写

    一.RTC RTC(Real-Time Clock) 实时时钟. RTC是集成电路,通常称为时钟芯片.在一个嵌入式系统中,通常采用RTC来提供可靠的系统时间,包括时分秒和年月日等,而且要求在系统处于关 ...

  6. 14. 从0学ARM-exynos4412-看门狗裸机程序编写

    看门狗 一.概念 看门狗的简称是WDT(Watch Dog Timer),exynos4412scp中的看门狗定时器(WDT)是一种定时装置. 1. 工作原理 由(一般需要客户编写)软件读写定时器相关 ...

  7. 20151009 C# 第一篇 程序编写规范

    20151009 程序编写规范 1. 代码书写规则: 1).尽量使用接口,然后使用类实现接口. 2).关键语句写注释 3).避免写超过5个参数的方法,如果要传递多个参数,则使用结构 4).避免代码量过 ...

  8. Android Camera 相机程序编写

    Android Camera 相机程序编写 要自己写一个相机应用直接使用相机硬件,首先应用需要一个权限设置,在AndroidManifest.xml中加上使用设备相机的权限: <uses-per ...

  9. HTML5 canvas绘制雪花飘落动画(需求分析、知识点、程序编写分布详解)

    看到网上很多展示html5雪花飞动的效果,确实非常引人入胜,我相信大家也跟我一样看着心动的同时,也很好奇,想研究下代码如何实现:虽然哦很多地方也能下载这些源码,不过也不知道别人制作此类动画时的思路及难 ...

随机推荐

  1. Django admin源码剖析

    单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. ...

  2. Python 3基础教程29-os模块

    本文介绍os模块,主要是介绍一些文件的相关操作. 你还有其他方法去查看os 1. help() 然后输入os 2. Python接口文档,前面提到的用浏览器打开的,os文件路径为:C:\Users\A ...

  3. 第三十篇 面向对象的三大特性之继承 supre()

    继承 一 .什么是继承? 类的继承跟现实生活中的父.子.孙子.重孙子的继承关系一样,父类又称基类. Python中类的继承分为:单继承 和  多继承. # 定义父类 class ParentClass ...

  4. Windows系统的高效使用

    1-WIndows10系统的入门使用 2-如何把系统盘的用户文件转移到其他盘 3-Windows装机软件一般有哪些? 4-Windows系统有哪些比较好用的下载器? 5-Windows系统中的播放器 ...

  5. Kubernetes实战 高可用集群搭建,配置,运维与应用

    1-1 K8S导学 1-2 搭建K8S集群步骤和要点介绍 1-3 搭建三节点Ubuntu环境 1-4 安装容器引擎 1-5 下载Kubeadm.node组件和命令行工具 1-6 向集群中加入worke ...

  6. Leetcode 55. Jump Game & 45. Jump Game II

    55. Jump Game Description Given an array of non-negative integers, you are initially positioned at t ...

  7. [Linux] 服务器镜像定时备份解决方案 crontab+rsync+flock

    两台服务器定时同步文件解决方案: 环境: 主机:192.168.1.1 镜像机:192.168.1.2 需要将主机内容备份至镜像机(假设用户都为root) 备份内容为 /export 目录下所有内容至 ...

  8. const 常量与 define常量的区别

    c++中的常量可以使用const定义,也可以使用#define宏定义的方式:二者区别如下: - **区别** 1. const定义的常量有自己的数据类型,编译器可以对其进行严格的类型检查:但是defi ...

  9. cmp快排 结构体快排

    由于深陷于JAVA的面向对象思想,常常会用到结构体,记一下这个模板,方便直接调用进行结构体排序: struct point { int val,turn; }; bool cmp(struct poi ...

  10. java正则表达式 3 -- 查找

    用正则表达式执行查找命令,则需要用正则对象,其规则和执行顺序如下: 指定为字符串的正则表达式必须首先被便以为此类的实例.然后,可将得到的正则对象匹配任意的字符串用于创建Mather对象,执行匹配所涉及 ...