2013-10-21 49 views
3

int放入char数组中的最佳方法(性能)是什么? 这是我的当前代码:将int转换为char数组的最佳方法

data[0] = length & 0xff; 
data[1] = (length >> 8) & 0xff; 
data[2] = (length >> 16) & 0xff; 
data[3] = (length >> 24) & 0xff; 

datachar阵列(共享PTR)和lengthint

+0

这是最好的方法。我所知道的。 :) – hasan83

+1

一个工会可以提供相同的功能,但要小心endianness:http://www.cplusplus.com/doc/tutorial/other_data_types/ – Aybe

+0

“最优化”...? –

回答

6

你正在寻找的memcpy

char x[20]; 
int a; 
memcpy(&a,x,sizeof(int)); 

你的解决方案也不错,因为它是endian safe

在一个侧面说明: -

虽然目前还没有这样的保证sizeof(int)==4针对任何特定的实现。

+2

memcpy endian安全吗? –

+0

@KacperFałat:是的,因为它将来自source指向的位置的num个字节的值直接复制到目标指向的内存块。 –

+0

我还有一个问题,因为我认为该方法比手动复制快,所以有选择返回表单字符数组int使用memcpy像函数? 有funcion返回与我的旧API,返回(无符号int)(数据[0]&0xff)| ((data [1]&0xff)<< 8)| ((data [2]&0xff)<< 16)| ((数据[3]&0xff的)<< 24); –

3

只需使用reinterpert cast。像使用int指针一样使用数据数组。

char data[sizeof(int)]; 
    *reinterpret_cast<int*>(data) = length; 

BTW memcpy比这慢得多,因为它使用循环逐字节复制。
在一个整数情况下,这只是一个简单的分配。

+0

数据有比4更多的值。 –

+0

好吧。在sizeof(int)> 4'的平台上失败。你应该确保它不是。 OP代码当然也是如此。 –

+0

@KacperFałat数据大于4并不重要。它将reinterepert指针(数组的开头),就好像它是一个整数指针。它也可以与偏移一起工作,就像Konrad所说的那样,它只是将地址插入,就好像它是一个int的大小。 –

0

这是唯一的方法。理论上你可以使用memcpyreinterpret_cast,但你不能因为endians的问题。

+0

理论上,*实际*。只要能够保证字节顺序(并且它可以在很多但不是全部的应用中),铸造/复制方式是绝对安全的。 –

+0

但是,在大多数平台上更改endian的需求将不会提升性能。 –

+0

这只有在您将数据发送到其他计算机时才相关。只要它保持在同一台机器上,它就是安全和高效的。对于很多事情来说,这完全够用了。声称这种方式不能使用是不准确的。 –