我將應用程序從32位移植到64位。
它是C風格的編碼(遺留產品),雖然它是C++。我有一個問題,即使用聯合和結構的組合來存儲值。這裏使用了一個名爲「Any」的自定義數據類型,它應該保存任何基本數據類型的數據。 Any的實現如下:指針轉換爲64位環境中的長移植問題
typedef struct typedvalue
{
long data; // to hold all other types of 4 bytes or less
short id; // this tells what type "data" is holding
short sign; // this differentiates the double value from the rest
}typedvalue;
typedef union Any
{
double any_any;
double any_double; // to hold double value
typedvalue any_typedvalue;
}Any;
該聯合的大小爲8個字節。他們使用了union,所以在給定的時間只有一個值,他們使用struct來區分類型。您可以在任何給定時間存儲double,long,string,char,float和int值。那是這個想法。 如果它是一個double值,則該值存儲在any_double中。如果它的任何其他類型,則它存儲在「數據」中,並且該值的類型存儲在「ID」中。 「符號」會告訴如果值「任何」持有雙重或其他類型。 any_any在代碼中用於寬泛地複製地址空間中的值,而不考慮類型。 (這是我們最大的問題,因爲我們不知道在給定的時間它會保持什麼!)
如果它的一個字符串或指針「任何」是假設保存,它存儲在「數據」(這是鍵入long)。在64位,這是問題所在。指針是8個字節。所以我們需要將「long」改爲等效的8個字節(long long)。但是那樣會將聯合的大小增加到16個字節,「any_any」的自由使用會導致問題。 「any_any」的用法太多,你永遠不知道它可以容納什麼。
我已經嘗試了這些步驟,結果不成功:
1.在結構中將「長數據」更改爲「長長數據」,這將使聯合的大小爲16個字節。 - 這將不允許數據作爲「any_any」(8字節)傳遞。
2.將結構聲明爲聯合內的指針。並將struct中的「long data」更改爲「long long data」。 - 這裏遇到的問題是,因爲它的指針我們需要爲結構分配內存。自由使用「any_any」使我們難以分配內存。有時我們可能會覆蓋內存,從而抹去價值。
3.創建一個單獨的集合,該集合將保存「數據」(鍵值對)的值。 - 這是行不通的,因爲這個實現是應用程序的核心,集合會運行到數百萬的數據。
有人可以幫我嗎?
所以你有一個64位平臺,其中'sizeof(long)!= 8'? – Alnitak 2011-06-15 09:00:52
@Alnitak nope,這是在窗口和sizeof(長)= 4。我需要改變這很長的ñ這就是我的問題在於 – Reji 2011-06-15 09:28:58