我們遇到了結構內存壓縮和對齊問題。Clang和Visual C++結構對齊兼容性問題
Android不尊重#pragma包(推送,<n>),它在我們的代碼庫中有幾百個位置。這是導致段錯誤的原因。
而Android鏘編譯器要求的__屬性__裝飾上的結構或類,例如:
struct __attribute__((packed, aligned(8))) Test
{
char a;
char b;
double d;
};
與此相對的Visual C++,榮譽雜注:
#pragma pack(push, 8)
struct Test
{
char a;
char b;
double d;
};
#pragma pack(pop)
由於#pragma pack的使用非常廣泛,這將是一個耗時的工作。
我們嘗試使用-mms-bitfields編譯器標誌,它將默認結構佈局設置爲與Microsoft編譯器標準兼容(即它承認#pragma包)。然而,這隻適用於普通的結構,而不適用於具有基類或虛函數的類。我們在這些類中得到以下錯誤。
「錯誤:ms_struct可能不會產生與基類或虛函數的類兼容微軟的佈局[-Wincompatible-MS-結構]」
我們怎樣才能緩解這個問題 - 有沒有解決方法,使# pragma pack for non-trivial structs/classes除了遍歷push和pop之間的所有類/結構並添加packed屬性之外,它還可以工作嗎?
感謝
這是一個非常長的生存代碼庫,所以我猜這樣的事情肯定會發生,是的,我收集了grep/sed或專用腳本可能是要走的路。謝謝,讓我們看看是否有其他人遇到過這樣的問題,也許還有其他建議。 –