2013-11-21 47 views
1

我转换的多个C++应用的大的项目从32位MFC到64位。在可预见的未来,这些应用程序将被要求编译为32位和64位。INT_PTR在64位转换

我经历了这些类型的INT_PTR和UINT_PTR运行。我有两个问题。

  1. 是否将这些类型用作常规整数目的的“默认”类型(例如循环计数器等)被认为是最佳做法?

  2. 我知道这些类型的大小与您正在编译的环境的指针大小有关,但将它们用于通用整数似乎令人困惑。例如(INT_PTR i = 0; i < 10; i ++)...;我不是一个相关的指针或指针,所以这个类型的名字让我感到困惑。有没有更好的预定在这种情况下使用,或者我应该自己做?

我的编译器是VS2010。

由于

+1

大多数事物的基本类型有什么问题?在32位和64位环境中唯一需要担心的是在读取/写入二进制文件和处理某些值时的差异。如果您需要特定大小的字段,请使用适当的(int32_t,uint64_t等)或为两种环境定义您自己的字段。 –

+0

我最关心的是速度。有一些时间关键功能需要尽可能高效。我的理解是,在64位环境中最好使用64位整数来实现通用目的。我们还经常从内置函数中获得64位值。例如:MyFunc(strlen(my_string));在64位中,我的选项要么将strlen的结果强制转换为32位值,要么将MyFunc更改为size_t或UINT_PTR作为参数。 – user3015426

+1

如果您担心速度问题,是否有**应用程序的配置文件?如果你没有,不要担心。对客户而言重要的质量是“*足够快”*。客户通常不关心*“尽快”*。如果您确实需要加速应用程序,请考虑将密集计算卸载到任何矢量单元(例如SSE/AVX,GPU)。 – IInspectable

回答

0

如果您的循环是不相关的指针(即,它不是用来作为数组的索引或向量或类似的东西),用int每当需要一个通用的整数类型。这是一个很好的事情,以确保您的代码不依赖于int尺寸(虽然MS VS int是32位两个平台)。

使用size_tvector<...>::size_type或其他适当类型的索引相关的循环。

0

你可能想看看这个:http://msdn.microsoft.com/en-us/library/windows/desktop/aa383751%28v=vs.85%29.aspx/“Windows数据类型”

你可能是有关的宗旨,为这种类型的有点糊涂了。在那里确保如果你将一个指针指向一个int(你可能不应该这样做),那么你的int类型就适合了。 Windows有点奇怪(如果内存服务的话)在编译64位时,int仍然是32位。如果你需要一个特定大小的int,我会使用精确的宽度类型(在stdint.h中)

+0

'int'在64位Linux,64位Macintosh和64位BSD上也是32位。 – librik

+0

不知道我认为这些使用了更自然的64位大小的整数。 – Dweeberly

2

INT_PTR和类似的有一个非常具体的用例:他们建立一个足够大的数据类型,对齐要求来保存整数或指针类型。它用于方法具有参数或返回类型(整数数据类型或指针)的情况下(如GetWindowLongPtr)。

For循环还有比这等没有通用的建议是:使用最合适的类型。如果您的循环索引用于索引到容器中,请将其设置为size_t。如果你的循环指数是在所有值xy之间运行一个整数,使用xy,或一个与两个兼容类型。 INT_PTR并不是真正合适的循环索引数据类型。