2016-11-23 19 views
1

我們遇到了結構內存壓縮和對齊問題。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屬性之外,它還可以工作嗎?

感謝

回答

2

首先,在我的印象中,你正在做的事情基本上是錯誤的,當你有「幾百個地方」在你的代碼,你需要定義對齊,以防止段錯誤。這個編譯指示不標準,使用它並不普遍。最明顯的是,它不像你那樣廣泛地使用它。它也不在標準中。

無論如何,由於clang會忽略編譯指示,而msvcc會忽略這些屬性,所以我會把它們放在代碼中。您可以使用例如grepsed,以防止大量手動工作。

+0

這是一個非常長的生存代碼庫,所以我猜這樣的事情肯定會發生,是的,我收集了grep/sed或專用腳本可能是要走的路。謝謝,讓我們看看是否有其他人遇到過這樣的問題,也許還有其他建議。 –