Sha*_*ala 25 c++ performance type-conversion
我的应用程序需要将double值转换为char*以写入仅接受字符的管道.通常的方法是使用sprintf()函数或使用iomanip.h头文件中的ostringstream.
事实证明,这两者都有非常糟糕的表现.我的应用程序需要经常进行此转换,以至于它成为主要的瓶颈.
我还可以使用其他功能吗?我可以使用什么逻辑来编写有效的转换函数?到目前为止,我唯一想到的就是使用除法和修改操作来获取每个数字,并将这些数字附加到char*以获得整个double值.这似乎不是一个好方法,并且本身可能会有糟糕的表现.
提前感谢您的想法.
编辑:关于如何使用char*存在一些混淆.char*将是写入管道的fwrite函数的参数.
nha*_*tdh 18
如果要打印双重类型可以支持的任何数字,请使用其中的任何库来完成工作.它可以节省您的理智:为什么"dtoa.c"包含如此多的代码?
如果要以双精度打印数字子集.例如,小数点后最多4位数,小数点前不超过5位数,那么你可以使用除法和mod打印出数字并转换为int类型.我可以确认这种方法的性能.
编辑: 如果你的原始目的是发送数据进行通信,那么发送二进制形式的double将是最快和最准确的方法(由于转换没有可能的精度损失).其他答案解释了这样做的方法.
您可以将std :: ostream write和std :: istream read方法与任何数据类型一起使用,只需将数据重新解释为一个char指针:
double value = 5.0;
std::ostream os;
//...
os.write(reinterpret_cast<const char*>(&value), sizeof(value));
//..
std::istream is;
is.read(reinterpret_cast<char*>(&value), sizeof(value));
Run Code Online (Sandbox Code Playgroud)
如果你想逐字节读取数据.使用这种技术
double dbl = 2222;
char* ptr = (char*)(&dbl);
Run Code Online (Sandbox Code Playgroud)
这将返回dbl的最低字节.和ptr ++将引用dbl的第二个字节.
| 归档时间: |
|
| 查看次数: |
37015 次 |
| 最近记录: |