2014-03-19 38 views
6

我們有多個結構,它們是16字節對齊的。 在以前的GCC版本中,一切正常。 由於我們升級到GCC 4.8.2(以前我們使用了4.6),我們得到了一堆關於這些結構的警告。編譯一個對齊的結構在GCC中給出奇怪的警告

一個例子結構爲:

typedef struct _STRUCT 
{ 
    _STRUCT(): a(0), 
      b(0) {}; 

    uint32_t a; 
    uint32_t b; 
} STRUCT __attribute__((aligned (16))); 

編譯此代碼拋出以下警告在使用這個strcut:

warning: ignoring attributes on template argument '_STRUCT' [enabled by default] 

我真不明白,這是什麼警告是想告訴我而谷歌搜索也沒有幫助。

+0

「..警告在哪裏使用這個strcut」:你如何使用它? – deviantfan

+0

如何定義'_STRUCT'? –

+0

當我在'std :: list'或'std :: map'中使用struct時,會發生警告,例如'std :: list &aList;' – evotion

回答

2

@Shafik Yaghmour把我推向了正確的方向。檢查他提到的補丁的錯誤報告讓我得到正確的答案:

...但核心問題似乎是不支持typedefs上的對齊。 屬性((對齊))模板參數似乎根本沒有任何影響。

來源:http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48138

,導致了回答的__attribute__(aligned(16))位置是關鍵。 如果我把它無論是關鍵字struct或關閉大括號的警告消失,例如:

typedef struct __attribute__((aligned (16))) _STRUCT 
{ 

_STRUCT(): a(0), 
       b(0) {}; 

    uint32_t a; 
    uint32_t b; 
} __attribute__((aligned (16))) STRUCT; 

前者是從GCC文檔的建議後。 http://gcc.gnu.org/onlinedocs/gcc/Type-Attributes.html

對於enum,struct或union類型,您既可以枚舉,結構或聯合標記和類型的名稱之間,或剛剛過去的定義的右大括號指定的屬性。前者的語法是首選。

因此,情況是,前者的實現設置了typedef的對齊方式,解決方案設置了結構的對齊方式,這是首要的目標。

3

這個貌似是按照C++ PATCH for c++/48138 (losing __attribute ((aligned)) on template argument)有目的的,它說:

...只是我們不想保留模板類型參數的屬性,因爲它們不是重整的一部分,所以你可以得到一個類模板實例化,它是同一類型的,不管參數的對齊如何,但是有效的參數取決於首次使用哪個對齊來實例化它。

當我們放棄屬性時,PR建議發出警告,這很有道理。此修補程序在功能模板的情況下尚未提供警告,但對類模板也是如此。功能模板的警告將等到彌敦道補丁後,以提高模板過載診斷。

所以看起來警告是新的,但它處理的方式是一樣的。

+0

也就是說,我也發現了什麼,但是不明白聲明是什麼。在進一步搜索後,我發現了這個補丁的原始錯誤報告:http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48138 基本的答案是:不要在typdefs中使用alignments,因爲它沒有任何效果,這是警告試圖告訴我的。 – evotion