我对使用C / C ++比较陌生。我目前正在使用Visual Studio 2010并正在分析其他人编写的代码。我被告知有一个问题,我有一个使用太多内存的功能。事实上,它中的所有指针都是Float_64,我想知道如果我将它们更改为Float_32会产生什么样的影响。 Float_64和Float_32使用了多少内存,切换时是否有数据丢失?如果已经有人问过我,我很抱歉,但我似乎无法找到它。
谢谢!
答案 0 :(得分:2)
首先,据我所知,Float_32
和Float_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_64
和Float_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;
在上面的代码中,my64
是sizeof()
的一半my32
- 64和32位(8和4字节)。但是,my64_ptr
和my32_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_64
为double-precision(通常为double
)。
这实际上有点用词不当,因为双精度浮点数的精度是精度的两倍以上:双精度数可以准确地表示不到16位小数,而浮点数只能代表7位数。也就是说,你松散了9位小数切换准确性,这很容易打破一些算法。