用于Float_64的内存

时间:2012-05-31 14:32:03

标签: c memory

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

谢谢!

3 个答案:

答案 0 :(得分:2)

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

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

将所有Float_64替换为Float_32 s,您可以将内存使用量减少四分之一到一半,但保存的数量取决于有多少数量正在使用。在大多数情况下,它不太可能有所帮助,但如果你有数百万个花车,那么它很可能会有所帮助。

可能的影响更有趣。浮点数具有令人讨厌的精度损失特性,特别是在其范围的边缘附近。对于64位浮点数(双打),这已经超过了数万亿。然而,对于32位,在数十亿之后你开始失去精确度,而数万亿,数字开始跳过相当多。根据您正在使用的数据类型,这可能会对您产生影响。

答案 1 :(得分:1)

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

但是,如果名称是远程理智的,Float_64的大小将是64位(现代架构上为8字节),而Float_32将为32位。因此,如果您切换到使用Float_32而不是Float_64,则会将浮动内存的内存压力降低一半。现在,更不用说指向值的指针,这些指针仍将与它们的大小相同。所以,请考虑:

Float_64 my64;  
Float_32 my32;

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

在上面的代码中,my64sizeof()的一半my32 - 64和32位(8和4字节)。但是,my64_ptrmy32_ptr是指针,指针大小相同,无论它们指向的是什么。

代表是另一个考虑因素。据推测,Float_32精度低于Float_64 - 可能是一半,甚至更少。如果您需要具有高度重要性的浮动,则在转换为较小类型时可能会失去精度。唯一可以确定的方法是检查两种类型的规格w.r.t. precesion,并分析您需要操作的数据。但是,作为一般经验法则,较低的精度很可能足以满足大多数用途。

答案 2 :(得分:0)

  

Float_64和Float_32

使用了多少内存

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

  

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

吨! Float_32被称为single-precision(通常为float),而Float_64double-precision(通常为double)。

这实际上有点用词不当,因为双精度浮点数的精度是精度的两倍以上:双精度数可以准确地表示不到16位小数,而浮点数只能代表7位数。也就是说,你松散了9位小数切换准确性,这很容易打破一些算法。