• 1.80英雄合击
  • 英雄合击sf发布网
  • 英雄合击发布网
  • 英雄合击传奇网站
  • 网站首页
    当前位置 > 主页 > 1.80英雄合击 >

    C ++ Builder,64位软件构建和Viva64文艺复兴

    2019-10-24 11:55

    经过漫长的等待,C ++ Builder XE3 Update 1终于获得了构建64位应用程序的能力。这意味着使用此工具的开发人员很快就会面临这个不熟悉的64位错误世界。

    什么是64位错误?

    这只是程序中的常见错误。但它有一个独特的特征:它只在64位程序中显示出来[1]。同时,在构建32位版本的程序时,您不会发现此错误。这是一个非常简单的例子:

     float * buf =(float *)malloc(1000 * sizeof(float));无符号X =(无符号)buf;...float * p =(float *)X; 

    指针在unsigned int类型的变量中存储了一段时间。指针在64位程序中将变为64位,而无符号类型仍为32位。结果,高位将丢失,这将导致程序执行的不可预测的结果。由于在64位程序中很少出现错误,因此该错误更加隐蔽。仅当在地址空间的前4 GB之外分配内存时才会显示该问题。

    上面显示的64位错误很简单,没有太大兴趣。任何编译器都会警告你这样的危险类型转换。让我们研究一个更有趣的问题。

     float * Array =(float *)malloc(1000 * sizeof(float));float * p =数组+500;无符号A = 3;int B = -5;p [A + B] = 1.0f; 

    代码将在32位程序中运行,但会导致64位程序崩溃。原因是“A + B”表达式具有unsigned int类型。它将等于0xFFFFFFFEu。在任何情况下都是不正确的;但是在32位系统中,当向数字添加指针时会发生溢出,因此,尽管出现错误,32位程序仍将继续工作。

    这个缺陷比前一个更难找到。大多数编译器都认为代码中没有任何可疑内容。他们不会注意到以下代码中的任何奇怪:

     size_t Count = BigValue;for(unsigned Index = 0; Index!= Count; Index ++){...} 

    如果64位程序中Count变量的值高于UINT_MAX,则会发生无限循环。

    这一切只是冰山一角。在代码中使用幻数(4,32,0xFFFFFFFF),虚函数声明错误等导致64位错误。您可以在下面的文章“64位错误示例集合”中详细研究各种64位错误模式。

    64位代码优化的细微之处和细微差别

    除了错误之外,您可能会面临另一个意外和不愉快的事情:64位版本的程序与32位版本相比性能较低。事实上,64位程序应该更快[2]。但它通常不会在实践中发生。

    减速可能由以下几个原因引起:

    不适当的类型用作数组索引。它会导致许多无意义的类型转换。不适当的类型用于存储数据。由于数组大小的增加,消耗的内存量可能增长两倍。结果,将有更多的高速缓存未命中,并且数据通过总线的时间将增加。由于对齐变化,结构尺寸增加。它还会导致使用的内存量增加。该怎么办?

    现在您已经了解到,准备64位版本的程序不仅包括代码重新编译。您可能会遇到奇怪的错误和性能损失。

    描述避免64位错误的方法超出了本文的范围。关键是细微差别太大,无法在一篇文章中描述。这就是为什么我要把你推荐给另一个来源。

    几年前,我们写了一篇关于64位软件开发的大指南。它详细描述了64位错误的所有模式,优化64位程序的方法,以及为此类程序创建测试时要考虑的要点。

    开发64位C / C ++应用程序的经验教训

    许多使用Visual C ++的开发人员都熟悉这些材料。现在,我相信,它们对那些使用C ++ Builder编译器的人也会有用。该部分包含一般类型的信息,无论您使用何种工具,都将非常有用。

    Viva64

    本指南中提供的信息足以帮助您编写正确的64位程序。但是,如果您需要将大型软件项目移植到64位系统,它将会有很大帮助。无法审查整个代码并找到所有危险的碎片。

    PVS-Studio静态分析器具有一组称为Viva64的诊断规则来解决此问题。这是用于检测现有错误中的64位错误的最完整集合

    经过漫长的等待,C ++ Builder XE3 Update 1终于获得了构建64位应用程序的能力。这意味着使用此工具的开发人员很快就会面临这个不熟悉的64位错误世界。

    什么是64位错误?

    这只是程序中的常见错误。但它有一个独特的特征:它只在64位程序中显示出来[1]。同时,在构建32位版本的程序时,您不会发现此错误。这是一个非常简单的例子:

     float * buf =(float *)malloc(1000 * sizeof(float));无符号X =(无符号)buf;...float * p =(float *)X; 

    指针在unsigned int类型的变量中存储了一段时间。指针在64位程序中将变为64位,而无符号类型仍为32位。结果,高位将丢失,这将导致程序执行的不可预测的结果。由于在64位程序中很少出现错误,因此该错误更加隐蔽。仅当在地址空间的前4 GB之外分配内存时才会显示该问题。

    上面显示的64位错误很简单,没有太大兴趣。任何编译器都会警告你这样的危险类型转换。让我们研究一个更有趣的问题。

     float * Array =(float *)malloc(1000 * sizeof(float));float * p =数组+500;无符号A = 3;int B = -5;p [A + B] = 1.0f; 

    代码将在32位程序中运行,但会导致64位程序崩溃。原因是“A + B”表达式具有unsigned int类型。它将等于0xFFFFFFFEu。在任何情况下都是不正确的;但是在32位系统中,当向数字添加指针时会发生溢出,因此,尽管出现错误,32位程序仍将继续工作。

    这个缺陷比前一个更难找到。大多数编译器都认为代码中没有任何可疑内容。他们不会注意到以下代码中的任何奇怪:

     size_t Count = BigValue;for(unsigned Index = 0; Index!= Count; Index ++){...} 

    如果64位程序中Count变量的值高于UINT_MAX,则会发生无限循环。

    这一切只是冰山一角。在代码中使用幻数(4,32,0xFFFFFFFF),虚函数声明错误等导致64位错误。您可以在下面的文章“64位错误示例集合”中详细研究各种64位错误模式。

    64位代码优化的细微之处和细微差别

    除了错误之外,您可能会面临另一个意外和不愉快的事情:64位版本的程序与32位版本相比性能较低。事实上,64位程序应该更快[2]。但它通常不会在实践中发生。

    减速可能由以下几个原因引起:

    不适当的类型用作数组索引。它会导致许多无意义的类型转换。不适当的类型用于存储数据。由于数组大小的增加,消耗的内存量可能增长两倍。结果,将有更多的高速缓存未命中,并且数据通过总线的时间将增加。由于对齐变化,结构尺寸增加。它还会导致使用的内存量增加。该怎么办?

    现在您已经了解到,准备64位版本的程序不仅包括代码重新编译。您可能会遇到奇怪的错误和性能损失。

    描述避免64位错误的方法超出了本文的范围。关键是细微差别太大,无法在一篇文章中描述。这就是为什么我要把你推荐给另一个来源。

    几年前,我们写了一篇关于64位软件开发的大指南。它详细描述了64位错误的所有模式,优化64位程序的方法,以及为此类程序创建测试时要考虑的要点。

    开发64位C / C ++应用程序的经验教训

    许多使用Visual C ++的开发人员都熟悉这些材料。现在,我相信,它们对那些使用C ++ Builder编译器的人也会有用。该部分包含一般类型的信息,无论您使用何种工具,都将非常有用。

    Viva64

    本指南中提供的信息足以帮助您编写正确的64位程序。但是,如果您需要将大型软件项目移植到64位系统,它将会有很大帮助。无法审查整个代码并找到所有危险的碎片。

    PVS-Studio静态分析器具有一组称为Viva64的诊断规则来解决此问题。这是用于检测现有错误中的64位错误的最完整集合