我对使用 C/C++ 比较陌生。我目前正在使用 Visual Studio 2010 并正在分析其他人编写的一些代码。我收到了一个问题,即我的某个函数使用了太多内存。几乎其中的所有指针都是 Float_64,我想知道如果我将它们更改为 Float_32 会有什么样的影响。Float_64 和 Float_32 使用了多少内存,切换是否有数据丢失?如果已经有人问过这个问题,我很抱歉,但我似乎找不到它。
谢谢!
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()
my32
my64_ptr
my32_ptr
反响是另一个考虑因素。A 的Float_32
精度大概比 a 低Float_64
——可能只有一半,甚至更低。如果您需要具有非常高显着性的浮点数,则在转换为较小的类型时可能会降低精度。唯一确定的方法是检查两种类型的规范 wrt precesion,并分析您需要操作的数据。但是,作为一般经验法则,较低的精度很可能足以满足大多数用途。
首先,据我所知,它们不是内置类型Float_32
。Float_64
这表明他们是typedef
d,可能是float
(32) 和double
(64)。
假设是这种情况,即使不是,您也Float_32
可能占用 32 位空间,而您的空间Float_64
是 64 位宽。那只是从名字上来的。既然你说它们是指针,那么大小将取决于平台(32 位系统上的 32 位和 64 上的 64 位),但仍指向相同的大小值(因此最终的内存使用将是指针+类型,或在 64 位系统上使用 128 位Float_64
;我相信您可以完成其余的数学运算)。
通过将所有Float_64
s替换为Float_32
s,您将能够将内存使用量减少四分之一到一半,但节省多少取决于正在使用的数字数量。在大多数情况下,它不太可能有帮助,但如果你周围有数百万个浮点数,它会很有帮助。
可能产生的影响更有趣一些。浮点数有一个令人讨厌的精度损失特性,尤其是在它们范围的边缘附近。对于 64 位浮点数(双精度数),这远远超过了数万亿。然而,对于 32 位,在数十亿之后,您开始失去精度,而到了数万亿,数字开始跳动很多。根据您使用的数据类型,这可能会影响您。