Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
64位转换中的INT_PTR 我将一个大型C++应用程序从32位MFC转换成64位。在可预见的未来,这些应用程序将需要以32位和64位进行编译_C++_Visual Studio 2010_Mfc_32bit 64bit - Fatal编程技术网

64位转换中的INT_PTR 我将一个大型C++应用程序从32位MFC转换成64位。在可预见的未来,这些应用程序将需要以32位和64位进行编译

64位转换中的INT_PTR 我将一个大型C++应用程序从32位MFC转换成64位。在可预见的未来,这些应用程序将需要以32位和64位进行编译,c++,visual-studio-2010,mfc,32bit-64bit,C++,Visual Studio 2010,Mfc,32bit 64bit,我遇到过这些类型的INT_PTR和UINT_PTR。我有两个问题 将这些类型作为“默认”类型用于一般整数目的(如循环计数器等)是否被认为是最佳做法 我知道这些类型的大小与编译环境的指针大小有关,但将它们用于通用整数似乎令人困惑。例如,(INT_PTR i=0;i如果循环与指针无关(也就是说,它没有用作数组或向量的索引或诸如此类的东西),则在需要泛型整数类型时使用INT。确保代码不依赖于INT(尽管对于MS VSint而言,这两种平台都是32位的) 使用size\u t、vector::size\

我遇到过这些类型的INT_PTR和UINT_PTR。我有两个问题

  • 将这些类型作为“默认”类型用于一般整数目的(如循环计数器等)是否被认为是最佳做法


  • 我知道这些类型的大小与编译环境的指针大小有关,但将它们用于通用整数似乎令人困惑。例如,(INT_PTR i=0;i如果循环与指针无关(也就是说,它没有用作数组或向量的索引或诸如此类的东西),则在需要泛型整数类型时使用
    INT
    。确保代码不依赖于
    INT
    (尽管对于MS VS
    int
    而言,这两种平台都是32位的)


    使用
    size\u t
    vector::size\u type
    或其他与索引相关的循环的适当类型。

    您可能需要查看以下内容:“Windows数据类型”


    您可能对这种类型的用途有点困惑。它是为了确保如果您将指针强制转换为int(您可能无论如何都不应该这样做),您就有了一个适合的int类型。Windows在这方面有点奇怪(如果内存可用)当编译为64位时,int仍然是32位。如果需要特定大小的int,我会使用精确的宽度类型(在stdint.h中)
    INT\u PTR
    和类似的方法有一个非常具体的用例:它们建模的数据类型足够大,并且具有适当的对齐要求,可以容纳整数或指针类型。它用于方法具有参数或返回类型的情况,该返回类型可以是整型数据类型,也可以是指针(如)


    对于循环,除此之外没有其他通用建议:使用最合适的类型。如果循环索引用于索引到容器中,请将其设置为
    size\t
    。如果循环索引是一个整数,在
    x
    y
    之间的所有值上运行,请使用
    x
    y
    类型,或者使用com类型两者都适用。
    INT\u PTR
    实际上不是合适的循环索引数据类型。

    您可以使用数据类型“intptr\t”。这是一种特定于平台的数据类型。它在32位平台中保存4个字节的值,而在64位平台中保存8个字节的值。

    基本类型在大多数情况下有什么问题?在32位和64位环境中,唯一需要担心的是读/写二进制文件和处理某些值时的差异。如果需要特定大小的字段,请使用适当(int32、uint64等)或者为这两种环境定义您自己的。我主要关心的是速度。某些时间关键型函数需要尽可能高效。我的理解是,在64位环境中,一般使用64位整数更好。此外,我们通常从内置函数中获取64位值。例如:MyFunc(strlen(My_string));在64位中,我的选项要么将strlen的结果强制转换为32位值,要么将MyFunc更改为以大小t或UINT PTR作为参数。如果您关心速度,您是否实际分析了应用程序?如果没有,请不要担心。对客户来说重要的质量是“足够快”。客户通常不关心速度如果你真的需要加速应用程序,考虑将密集计算卸载到任何向量单元(例如SSE/AVX,GPU)。.int
    int
    在64位Linux、64位Macintosh和64位BSD上也是32位的。很高兴知道,我认为它们对int使用了更自然的64位大小。不幸的是,int_PTR也是MFC容器的索引和长度操作类型,类似于for(int I=0;I=0;--i)的内容结果是一个无止境的循环,或者很可能导致崩溃。同样值得注意的是,MFC容器使用INT_PTR作为索引和长度的类型(与无符号类型相反)我猜是这个反向循环问题造成的。@nar这不是特定于
    大小\u t
    。每当你将适用于有符号整数的构造应用于无符号整数时,都可能引发此错误。这里的教训不是:避免
    大小\u t
    。教训是:尽可能避免原始循环。@ILINSPECTABLE If course最好不要使用原始循环,但有时你不能合理地使用。更重要的是:分析和重写每个循环是一项艰巨的任务。我目前正在迁移一个MFC应用程序,该应用程序始于25年前,有数百万行代码。如果你一开始就有5000多个警告和数千个问题在没有警告的情况下,您不想花时间重写每个for循环。特别是当许多代码来自一个原始循环是唯一选项的时代,来自一个甚至没有模板的时代时。@nar在这种情况下,这些都没有意义。我在评论这句话时说,
    size\u t
    有“一个巨大的缺点”“。这根本不是真的。这里应该归咎于错误的代码,就像您的示例一样,它不仅因为签名冲突而失败,而且在空容器上也会失败。这两个问题都可以很容易地解决:
    for(size_t i=container.size();i>0;--i){/*对索引(i-1)*/}
    。修复了两个错误。现在“巨大的缺陷”在哪里?