将int
放入char
数组中的最佳方法(性能)是什么? 这是我的当前代码:将int转换为char数组的最佳方法
data[0] = length & 0xff;
data[1] = (length >> 8) & 0xff;
data[2] = (length >> 16) & 0xff;
data[3] = (length >> 24) & 0xff;
data
是char
阵列(共享PTR)和length
是int
。
将int
放入char
数组中的最佳方法(性能)是什么? 这是我的当前代码:将int转换为char数组的最佳方法
data[0] = length & 0xff;
data[1] = (length >> 8) & 0xff;
data[2] = (length >> 16) & 0xff;
data[3] = (length >> 24) & 0xff;
data
是char
阵列(共享PTR)和length
是int
。
你正在寻找的memcpy
char x[20];
int a;
memcpy(&a,x,sizeof(int));
你的解决方案也不错,因为它是endian safe。
在一个侧面说明: -
虽然目前还没有这样的保证sizeof(int)==4
针对任何特定的实现。
memcpy endian安全吗? –
@KacperFałat:是的,因为它将来自source指向的位置的num个字节的值直接复制到目标指向的内存块。 –
我还有一个问题,因为我认为该方法比手动复制快,所以有选择返回表单字符数组int使用memcpy像函数? 有funcion返回与我的旧API,返回(无符号int)(数据[0]&0xff)| ((data [1]&0xff)<< 8)| ((data [2]&0xff)<< 16)| ((数据[3]&0xff的)<< 24); –
只需使用reinterpert cast。像使用int指针一样使用数据数组。
char data[sizeof(int)];
*reinterpret_cast<int*>(data) = length;
BTW memcpy比这慢得多,因为它使用循环逐字节复制。
在一个整数情况下,这只是一个简单的分配。
数据有比4更多的值。 –
好吧。在sizeof(int)> 4'的平台上失败。你应该确保它不是。 OP代码当然也是如此。 –
@KacperFałat数据大于4并不重要。它将reinterepert指针(数组的开头),就好像它是一个整数指针。它也可以与偏移一起工作,就像Konrad所说的那样,它只是将地址插入,就好像它是一个int的大小。 –
这是唯一的方法。理论上你可以使用memcpy
或reinterpret_cast
,但你不能因为endians的问题。
理论上,*实际*。只要能够保证字节顺序(并且它可以在很多但不是全部的应用中),铸造/复制方式是绝对安全的。 –
但是,在大多数平台上更改endian的需求将不会提升性能。 –
这只有在您将数据发送到其他计算机时才相关。只要它保持在同一台机器上,它就是安全和高效的。对于很多事情来说,这完全够用了。声称这种方式不能使用是不准确的。 –
这是最好的方法。我所知道的。 :) – hasan83
一个工会可以提供相同的功能,但要小心endianness:http://www.cplusplus.com/doc/tutorial/other_data_types/ – Aybe
“最优化”...? –