最近在学习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. fiddler抓包-简单易操作(一)

    1.下载fiddler 可以到fiddler官网去下,网址:https://www.telerik.com/download/fiddler 下载完成后,安装即可. 2.运行fiddler,进入fid ...

  2. SQL - SELECT COUNT用法

     SQL Server数据库  COUNT() 函数返回匹配指定条件的行数.   语法   SQL COUNT(column_name) 语法   COUNT(column_name) 函数返回指定列 ...

  3. python基础篇 08 文件操作

    本节主要内容:1. 初识⽂件操作2. 只读(r, rb)3. 只写(w, wb)4. 追加(a, ab)5. r+读写6. w+写读7. a+写读(追加写读)8. 其他操作⽅法9. ⽂件的修改以及另⼀ ...

  4. 教你如何用Docker快速搭建深度学习环境

    本教程搭建集 Tensorflow.Keras.Coffe.PyTorch 等深度学习框架于一身的环境,及jupyter. 本教程使用nvidia-docker启动实例,通过本教程可以从一个全新的Ub ...

  5. GCD LCM 最大公约数 最小公倍数 分数模板 (防溢出优化完成)

    自己写的一个分数模板,在运算操作时进行了防溢出的优化: ll gcd(ll a, ll b) { return b ? gcd(b, a%b) : a; } ll lcm(ll a, ll b) { ...

  6. 并查集——poj1182(带权并查集高阶)

    题目链接:食物链 题解:点击 说一声:这题关系推导值得学习.

  7. beta版本冲刺七

    目录 组员情况 组员1:胡绪佩 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:恺琳 组员6:翟丹丹 组员7:何家伟 组员8:政演 组员9:黄鸿杰 组员10:何宇恒 组员11:刘一好 展示组内最新 ...

  8. DPDK 网卡RSS(receive side scaling)简介

    网卡RSS(receive side scaling)简介 RSS是一种网卡驱动技术,能让多核系统中跨多个处理器的网络收包处理能力高效能分配.注意:由于同一个核的处理器超线程共享同一个执行引擎,这个效 ...

  9. lintcode-59-最接近的三数之和

    59-最接近的三数之和 给一个包含 n 个整数的数组 S, 找到和与给定整数 target 最接近的三元组,返回这三个数的和. 注意事项 只需要返回三元组之和,无需返回三元组本身 样例 例如 S = ...

  10. PAT 1055 集体照

    https://pintia.cn/problem-sets/994805260223102976/problems/994805272021680128 拍集体照时队形很重要,这里对给定的 N 个人 ...