2013-10-21 48 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

這隻有在您將數據發送到其他計算機時才相關。只要它保持在同一臺機器上,它就是安全和高效的。對於很多事情來說,這完全夠用了。聲稱這種方式不能使用是不準確的。 –