[百度空间] [原]跨平台编程注意事项(二): windows下 x86到x64的移植
之前转的:
之前对于x64平台的移植都是纸上谈兵,算是前期准备工作, 但起码在写代码时,已经非常注意了.所以现在移植起来相对很顺利.昨天用了一天时间把自己代码添加了x64支持.
贴一下遇到的问题,就作为注意事项吧,以下文字来自我的cnblogs博客的另一文章,有修改
1.指针到数值的转换.
指针 (如void*)转到数值,要用intptr_t或者uintptr_t (用Win32的INT_PTR也可以,当然用C/C++标准的更好),而不使用int/uint/DWORD, 因为x64平台下的void*或者任何指针都是64位的, 转到DWORD(win x64的LLP64下的long,32位)就被截断到32位了,如果再转到64位的指针,就丢失了高双字的部分.
这个问题在"跨平台编程注意事项(一)"提到过, 目前基本没有遇到,因为之前的编码已经很注意这个问题了.但是有两行跟FreeImage相关的AlignedMalloc代码,直接复制FreeIamge里面的AlignedMalloc,他用的是void*-->unsigned long,当时直接Ctrl+V,没仔细看,所以这里程序就崩溃了.
2.内存边界对齐的问题.
目前Win32下 VC10默认对齐到8字节,x64对齐到16字节.
因为之前的内存管理没有考虑x64平台的内存对齐,所以会有一些问题.遇到的一个问题就是libPNG(FreeImage的依赖)中使用的setjmp(作为一个C++程序猿, setjmp/longjmp我从来不用的),执行到读写FPU状态标记FNSTCW(一个WORD)和MMX指令就崩溃,提示内存读0地址,但是看内存是好好的,调试了半天找不到原因,最后看了下创建的(我的内存管理给分配的)pngstruct没有对齐到16字节边界,导致setjmp的参数没有对齐.尝试性的试了下,居然好了.怀疑是读写非对齐内存的问题,但记得x86下不对齐只会有性能损失,x64会出错么? 不太了解,有空了再多搜搜文档,了解下.
目前解决方案是,内存管理模块会根据目标平台,选择对应的对齐大小.
3.Win32下的各种API.
一些MFC的三方库没有用DWORD_PTR和INT_PTR作为参数.其他主要是GetWindowLongPtr这类,看msdn上说要用这个保持x86/x64兼容,这个早已经用了,但没发现对应的宏,GWL_XXX的对应要用GWLP_XXX的版本,这个一开始也是觉得诡异,怎么x64下没有这个宏了,不知道有什么问题,后面google了一下就出来了,相对比较简单.
4.内联汇编.
在MSVC的x64编译器不支持内联汇编了(以后可能会支持?),这个以前不知道,还傻乎乎写了64位的内联汇编,后来在贴吧知道了,就把预先写的64位内联汇编删除了...其实也没怎么用内联汇编,主要就是同步锁用了lock cmpxchg,以及原子操作用了lock xadd等等,解决方法也很简单,去掉所有内联汇编,用MSVC的intrins: _InterlockedCompareExchange / _InterlockedCompareExchange64 一族和GCC的built-in: __sync_fetch_and_add / __sync_add_and_fetch / __sync_bool_compare_and_swap一族.
[百度空间] [原]跨平台编程注意事项(二): windows下 x86到x64的移植的更多相关文章
- [百度空间] [原]跨平台编程注意事项(三): window 到 android 的 移植
大的问题 先记录一下跨平台时需要注意的大方向. 1.OS和CPU 同一个操作系统, CPU也可能是不一样的, 比如windows也有基于arm CPU的版本,而android目前有x86,arm,mi ...
- (二)windows下安装PHPCMS V9
一.准备工作 搭建环境 :参考:Windows下搭建PHP开发环境及相关注意事项 PHPCMS V9 :下载适合自己 PHPCMS V9 版本到本地或服务器,下载地址:http://www.phpcm ...
- [百度空间] [原]android下的各种坑
一堆so文件安装不正确: apk里面都是全的, 但是安装完后/data/data/$pkg/lib下面就没有 google了好长时间没有结果.最后发现是因为没库有加lib前缀(当时想了一下觉得不加更好 ...
- [百度空间] [原]MFC杂乱笔记
1. 创建动态菜单 假如ID是动态分配的,那么重载virtual BOOLOnCmdMsg(UINT,int,void*,AFX_CMDHANDLERINFO*); 据MSDN不详细解释,当第二个参数 ...
- [百度空间] [原]DLL导出实例化的模板类
因为模板是在编译的时候根据模板参数实例化的,实例化之后就像一个普通的类(函数),这样才有对应的二进制代码;否则,没有模板参数,那么编译器就不知道怎么生成代码,所以生成的DLL就没有办法导出模板了.但是 ...
- [百度空间] [原]CImageList支持32位透明位图
32位的位图主要是包含Alpha值(0-255)可以有半透效果的.之前用FreeImage加载 的DIB, CImageList直接绘制会有黑色背景.即便用了ILC_MASK,也创建了mask map ...
- [百度空间] [原] Empty base class optimization
最近遇到了一个诡异的问题, 数组的数据不对, 最后发现是两个类型的大小不一样导致的. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 ...
- [百度空间] [原] 全局operator delete重载到DLL
由于很久没有搞内存管理了,很多细节都忘记了今天项目要用到operator delete重载到DLL,发现了问题,网上搜索以后,再对比以前写的代码,发现了问题:原来MSVC默认的operator new ...
- 大家好,我是一个热爱编程的大二在读生,今天来移植一下CSDN上的博客
今天开了博客园,将原来再CSDN上的博客移植一下,嘿嘿嘿.
随机推荐
- C++求平均数
题目内容:求若干个证书的平均数. 输入描述:输入数据含有不多于5组的数据,每组数据由一个整数n(n<=50)打头,表示后面跟着n个整数. 输出描述:对于每组数据,输出其平均数,精确到小数点后3位 ...
- 添加TextView隐藏进度条的方法
在TextView中添加 android:scrollbars="vertical" android:singleLine="false" 在Activity代 ...
- 【easuyi】---easyui中的验证validatebox自定义
这里比较简单的使用就不再多说,主要说一下自定义的validatebox. 1.验证密码是否相等,这个直接参考给定的列子就行,这里主要学习这种灵活使用的方式和方法. <input id=" ...
- C 的 一些写法格式 交流
好久以前刚开始学习前辈们的代码的时候,发现好多代码感到好奇怪. 1)代码看不懂 2)代码格式看不懂 网上也没见同学们分享.当自己代码写多了,也渐渐的理解为什么要这样写了. 说主题之前 还是 说一些 题 ...
- MIFARE系列6《射频卡与读写器的通讯》
1. 复位应答(Answer to request) 读写器呼叫磁场内的卡片,卡片对呼叫做出应答.对刚进入磁场得到电复位处于休闲状态的卡片,卡请求(REQA,0x26):对于已进行过读写操作并进入休眠 ...
- TAT 前端突击队 第四关 题目 腐蚀的画
腐蚀的画 1.一个漂亮的画作在经过几千年岁月的洗礼下,部分地方已经被腐蚀了,像一个孤独的老人,满脸爬满了皱纹.2.但在一个晚上,老王突然发现,这些腐蚀的部分中,隐藏着岁月留下的密秘.请你帮助老王寻找这 ...
- JavaScript高级程序设计之window对象
在浏览器中window对象实现了JavaScript中的Global对象: window对象是最顶层的对象: 所有其他全局的东西都可以通过它的属性检索到. ; window.aa = ; // 所有全 ...
- 在meteor中如何使用ionic组件tabs,及如何添加使用cordova plugin inappbrower
更新框架: meteor update meteor框架的优点不言而喻,它大大减轻了App前后端开发的负担,今年5月又获得B轮2000万融资,代表了市场对它一个免费.开源开发框架的肯定.cordova ...
- [转]ubuntu 10.04下的配置tftp服务器
[转]ubuntu 10.04下的配置tftp服务器 http://www.cnblogs.com/geneil/archive/2011/11/24/2261653.html 第1步:安装tftp所 ...
- P1233: [Usaco2009Open]干草堆tower
这道题,首先想到的就两个,一是贪心,二是动规,然而 1<=N<=100000;1<=w_i<=10000 的数据范围实在不敢恭维,所以说第一想法是错的.仔细一想,首先,我们需要 ...