原始类型的转换会增加/减少内存使用吗?

时间:2017-07-21 06:09:11

标签: c++

我试图在程序中尽可能多地保存内存。在输出一些数据时,我需要有小数精度。我的想法是将变量创建为int,然后在需要十进制精度时将其转换为double

这是一个例子

int x, y, z;
cin >> x >> y >> z;

cout << (double)x/2 << endl << (double)y/2 << endl << (double)z/2 << endl;

这是否会使变量占用内存中double的空间?

也有类似的情况,但是向后,

double x, y, z;
cin >> x >> y >> z;

cout << (int)x/2 << endl << (int)y/2 << endl << (int)z/2 << endl;

变量会占用更少的空间吗?

我的整体问题是原始类型的转换会增加/减少内存使用量吗?

2 个答案:

答案 0 :(得分:1)

内存有两种用法:

  • 程序存储器:存储代码本身的存储器使用情况
  • 数据存储器(堆栈/堆):用于数据

你的演员阵容可能会通过一些指令(几个字节)来增加程序的长度,这通常没有任何问题。

另一方面,强制转换不会增加数据记忆(强制转换是暂时的,一消耗就会消失)

最后,使用int或double之间的内存大小:

  • int通常在现在的计算机上占用32位
  • double通常为64位

因此,将大量数据保存为int而不是double是有意义的。

答案 1 :(得分:1)

实际上你的问题非常依赖架构

常规中,不应为那些投射操作保留stack空格。

为了给你一个想法,汇编输出(在x86-64上用32位编译,gcc没有任何优化)如下:

fildl   -12(%ebp)
fldl    .LC0
fdivrp  %st, %st(1)
subl    $4, %esp
leal    -8(%esp), %esp
fstpl   (%esp)
pushl   std::cout
call    std::basic_ostream<char, std::char_traits<char> >::operator<<(double)

最后调用的函数是std::operator<<(double)

如您所见,前三个指令中使用了转换操作。 double值保存在临时寄存器st中。

虽然double是临时寄存器,但对std::cout<<运算符的调用情况略有不同。那是因为参数是double(而不是整数)。因此,std::operator<<(double)函数的分配堆栈略大于std::operator<<(int)(在该架构中,double占用8个字节,整数4个字节)。

总之,通过铸造操作:

  • 显然,代码大小会增加,因为 cast 操作会引入额外的机器指令以执行转换。
  • 函数调用中的保留堆栈略大,因为operator<<保留了double。

一般而言,所有那些“副作用”在一般架构上并不重要。您可能应该关心嵌入式体系结构(特别是关于浮点运算)。