2

我对使用 C/C++ 比较陌生。我目前正在使用 Visual Studio 2010 并正在分析其他人编写的一些代码。我收到了一个问题,即我的某个函数使用了太多内存。几乎其中的所有指针都是 Float_64,我想知道如果我将它们更改为 Float_32 会有什么样的影响。Float_64 和 Float_32 使用了多少内存,切换是否有数据丢失?如果已经有人问过这个问题,我很抱歉,但我似乎找不到它。

谢谢!

4

3 回答 3

2

Float_64并且Float_32不是 C++ 标准中定义的 C++ 类型,因此它们必须特定于您的应用程序或您正在使用的库。

但是,如果名称比较合理,a 的大小Float_64将为 64 位(现代架构为 8 字节),a的大小Float_32为 32 位。因此,如果你改用 usingFloat_32而不是Float_64,你会将浮点数本身的内存压力减少一半。现在,更不用说指向值的指针,它们的大小仍然与原来相同。所以,考虑:

Float_64 my64;  
Float_32 my32;

Float_64 * my64_ptr = &my64;
Float_32 * my32_ptr = &my32;

在上面的代码中,分别是64 位和 32 位(8 和 4 字节)my64的一半。但是,and是指针,并且指针的大小相同,无论它们指向什么。sizeof()my32my64_ptrmy32_ptr

反响是另一个考虑因素。A 的Float_32精度大概比 a 低Float_64——可能只有一半,甚至更低。如果您需要具有非常高显着性的浮点数,则在转换为较小的类型时可能会降低精度。唯一确定的方法是检查两种类型的规范 wrt precesion,并分析您需要操作的数据。但是,作为一般经验法则,较低的精度很可能足以满足大多数用途。

于 2012-05-31T14:38:24.247 回答
2

首先,据我所知,它们不是内置类型Float_32Float_64这表明他们是typedefd,可能是float(32) 和double(64)。

假设是这种情况,即使不是,您也Float_32可能占用 32 位空间,而您的空间Float_64是 64 位宽。那只是从名字上来的。既然你说它们是指针,那么大小将取决于平台(32 位系统上的 32 位和 64 上的 64 位),但仍指向相同的大小值(因此最终的内存使用将是指针+类型,或在 64 位系统上使用 128 位Float_64;我相信您可以完成其余的数学运算)。

通过将所有Float_64s替换为Float_32s,您将能够将内存使用量减少四分之一到一半,但节省多少取决于正在使用的数字数量。在大多数情况下,它不太可能有帮助,但如果你周围有数百万个浮点数,它会很有帮助。

可能产生的影响更有趣一些。浮点数有一个令人讨厌的精度损失特性,尤其是在它们范围的边缘附近。对于 64 位浮点数(双精度数),这远远超过了数万亿。然而,对于 32 位,在数十亿之后,您开始失去精度,而到了数万亿,数字开始跳动很多。根据您使用的数据类型,这可能会影响您。

于 2012-05-31T14:38:29.367 回答
0

Float_64 和 Float_32 使用了多少内存

分别为 8 字节(64 位)和 4 字节(32 位)。

切换是否有任何数据丢失?

吨!Float_32是所谓的单精度(通常float),Float_64而是双精度(通常double)。

这实际上有点用词不当,因为双精度数的精度是浮点数的两倍多:双精度数可以准确表示小数点后 16 位,而浮点数只能表示小数点后 7 位。也就是说,通过切换,您会丢失 9 个小数位的精度,这很容易破坏一些算法。

于 2012-05-31T14:41:33.290 回答