ACE的CDR中的字节对齐问题
大家應(yīng)該都知道計算機中間都有字節(jié)對齊問題。CPU訪問內(nèi)存的時候,如果從特定的地址開始訪問一般可以加快速度,比如在32位機器上,如果一個32位的整數(shù)被放在能被32模除等于0的地址上,只需要訪問一次,而如果不在,可能要訪問兩次。但是這樣就要求一些數(shù)據(jù)從特定的地址開始,而不是順序排放(中間會有一些空余的地址),這就是字節(jié)對齊。
而ACE CDR的估計也是為了加快速度,從而在CDR編碼上默認(rèn)也使用了字節(jié)對齊。所以在ACE的CDR編解碼過程中,傳入的參數(shù)地址最好是能符合字節(jié)對齊規(guī)則,否則可能會編解碼錯誤。
ACE_OutputCDR構(gòu)造函數(shù)會調(diào)用一個函數(shù)mb_align調(diào)整傳入的地址參數(shù)成為地址對齊地址。但是其的調(diào)整函數(shù)ACE_ptr_align_binary不知處于什么考慮,不是按照機器的對齊長度而是采用的?ACE_CDR::MAX_ALIGNMENT(64bit,長度為8BYTPES)作為參數(shù)地址。那么ACE_OutputCDR的內(nèi)部地址是按照8字節(jié)作為對齊的,但是ACE_InputCDR卻沒有將內(nèi)部地址調(diào)整為模除64等于0的地址上,而只是調(diào)整為模除32(在32位機器上)等于0的地址。
?
void
ACE_CDR::mb_align (ACE_Message_Block *mb)
{
#if !defined (ACE_CDR_IGNORE_ALIGNMENT)
??//如果使用字節(jié)對齊方式,使用最大的對齊方式調(diào)整內(nèi)存。調(diào)整為模除64等于0的地址上。
??char * const start = ACE_ptr_align_binary (mb->base (),
?????????????????????????????????????????????ACE_CDR::MAX_ALIGNMENT);
#else
……
}
使用一段簡單的代碼可以測試發(fā)現(xiàn)這個問題。
?
char *tmp_buffer = new char [2048];
//使用一個無法對齊的參數(shù)作為ACE_InputCDR,ACE_OutputCDR的參數(shù)地址,
char *tmp_data = tmp_buffer +1;
?
// output_cdr調(diào)整了對齊的起始地址為8字節(jié)的默認(rèn)
ACE_OutputCDR output_cdr(tmp_data,512);
ACE_InputCDR input_cdr(tmp_data,512);
?
ACE_CDR::ULong cdr_long = 123;
bool bret =false;
//
bret = output_cdr.write_ulong(cdr_long);
// cdr_long?不等于123,而是一個錯誤無效數(shù)據(jù)。
bret = input_cdr.read_ulong(cdr_long);
?
?
其實如果編解碼的BUFF都采用相同的對齊方式,那么理論上也不應(yīng)該出現(xiàn)問題,最多是出現(xiàn)為了對齊而進(jìn)行填補的空隙,但是這樣能帶來CPU的效率提升,也是好事。但是由于ACE_OutputCDR的一個地址調(diào)整。卻可能導(dǎo)致編解碼的BUFFER不一致,我不能肯定這到底是一個錯誤還是作者有他自己的考慮。
這個問題到5.6.1還存在。我已經(jīng)提交了問題報告。
當(dāng)然有一個方法解決這個問題。就是定義宏ACE_CDR_IGNORE_ALIGNMENT【注】,只要定義了這個宏,ACE就不會使用字節(jié)對齊處理CDR編碼。使用這個方法的,編碼占用空間會壓縮一些,但效率上可能低一點(其實未必,因為為了字節(jié)對齊還要耗費一些計算時間),
?
【注】ACE不知道為什么在代碼中使用兩個不使用字節(jié)對齊的宏,一個是在CDR_Base.h CDR_Base.cpp?文件中使用的是ACE_CDR_IGNORE_ALIGNMENT,在CDR_Stream.cpp和CDR_Stream.h文件上使用的宏ACE_LACKS_CDR_ALIGNMENT。
我一般將兩個宏都定義上。
轉(zhuǎn)載于:https://www.cnblogs.com/405845829qq/p/4378588.html
總結(jié)
以上是生活随笔為你收集整理的ACE的CDR中的字节对齐问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 人工智能需要学习哪些编程语言?学人工智能
- 下一篇: 决策树算法——ID3算法,C4.5算法