[百度空间] [原]跨平台编程注意事项(二): 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上的博客移植一下,嘿嘿嘿.
随机推荐
- [Linux] Ubuntu Server 12.04 LTS 平台上搭建WordPress(Nginx+MySql+PHP) Part II
接着上一节继续搭建我们的LNMP平台,接下来我们安装PHP相关的服务 sudo apt-get install php5-cli php5-cgi php5-fpm php5-mcrypt php5- ...
- 复习URLHttpConnection方式GET,POST方式链接网络解析uri
xml: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:t ...
- 【转】 BSS段 数据段 代码段 堆栈 指针 vs 引用
原文:http://blog.csdn.net/godspirits/article/details/2953721 BSS段 数据段 代码段 堆栈 (转+) 声明:大部分来自于维基百科,自由的百科全 ...
- python Django 学习笔记(二)—— 一个简单的网页
1,创建一个django项目 使用django-admin.py startproject MyDjangoSite 参考这里 2,建立视图 from django.http import HttpR ...
- Python核心编程--学习笔记--7--字典和集合
本章介绍Python语言中的映射类型(字典)和集合类型,包括操作符.工厂函数.内建函数与方法. 1 字典 字典是Python中唯一的映射类型——键key直接映射到值value.字典是容器类型,其对象是 ...
- ruby 程序中的文字编码
1,问题 在写一个统计代码行数的脚本时遇到一个问题: 代码: file_name = "code.rb"c = 0File.foreach(file_name) do |x| ne ...
- 菜鸟学习Hibernate——多对多关系映射
Hibernate中的关系映射,最常见的关系映射之一就是多对多关系映射例如用户与角色的关系,一个用户对应多个角色,一个角色对应多个用户.如图: Hibernate中如何来映射这两个的关系呢? 下面就为 ...
- spring 方法注入
package com.haut.grain.junit.test; public class Command {private Object state;public void setState( ...
- 设置SVN hooks实现自动发布
# CentOS下安装SVN yum -y install subversion svnserve --version cd /home/ mkdir svn cd svn/ /usr/bin/svn ...
- oracle12c不能进入到http://localhost:5500/em的解决办法
Oracle11g企业管理器无法打开——解决https://localhost:1158/em 页面无法打开的问题 常见的问题:https://localhost:1158/em 无法打开 解决办法: ...