我试图在程序中尽可能多地保存内存。在输出一些数据时,我需要有小数精度。我的想法是将变量创建为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;
变量会占用更少的空间吗?
我的整体问题是原始类型的转换会增加/减少内存使用量吗?
答案 0 :(得分:1)
内存有两种用法:
你的演员阵容可能会通过一些指令(几个字节)来增加程序的长度,这通常没有任何问题。
另一方面,强制转换不会增加数据记忆(强制转换是暂时的,一消耗就会消失)
最后,使用int或double之间的内存大小:
因此,将大量数据保存为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个字节)。
总之,通过铸造操作:
operator<<
保留了double。一般而言,所有那些“副作用”在一般架构上并不重要。您可能应该关心嵌入式体系结构(特别是关于浮点运算)。