2017-01-17 20 views
4

私はC++で始まったばかりです。ソースコードを見るのが最善の方法だと思います。ヘッダファイルに次のようなコードがあります。警告: 'assume_aligned'属性の指示が無視されました

#ifdef _MSC_VER 
#define MYAPP_CACHE_ALIGNED_RETURN /* not supported */ 
#else 
#define MYAPP_CACHE_ALIGNED_RETURN __attribute__((assume_aligned(64))) 
#endif 

私はgcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-11)とかなり古いものを使用しています。コンパイル時にこの警告が表示されます。

warning: 'assume_aligned' attribute directiv e ignored [-Wattributes] – 

コンパイル時の警告を修正するためにif文を具体的にするにはどうすればよいですか?

+0

あなたは何の警告を見ていますか? – yugr

+0

@yugr警告: 'assum_aligned'属性の指示は無視されます[-Wattributes] ' – user2650277

+0

興味深い[リンク] http://stackoverflow.com/questions/9608171/how-to-tell-gcc-that-a-pointer-argument -is-always-double-word-alignedレポートは、__builtin_assume_alignedがすでに4年前にサポートされています。あなたのGCCは2015年から...それは動作するはずです。 – JHBonarius

答えて

2

assume_alignedは、RHELのGCCではサポートされていないようです(アップストリームgcc-4_8ブランチにバックポートされていないし、Ubuntu 14.04のGCC 4.8.4では使用できないため驚くことではありません)。

#if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 9) 
# warning "Your version of GCC does not support 'assume_aligned' attribute" 
#endif 

しかし、あなたのディストリビューションベンダーがバックポートしている場合、これは、上流からassume_alignedを動作しない場合があります:あなたはあなたのヘッダーの1つにGCCのバージョンの明示的なチェックを行うことができ、よりユーザーフレンドリーな診断を発するように

(これはRedHatとUbuntuでは当てはまりませんが、他のディストリビューションについて知っています)。これを確認するための最も強力な方法は、configureスクリプトまたはMakefileでビルド時のテストを行うには、次のようになります。

CFLAGS += $(shell echo 'void* my_alloc1() __attribute__((assume_aligned(16)));' | gcc -x c - -c -o /dev/null -Werror && echo -DHAS_ASSUME_ALIGNED) 

属性は、コンパイラによってサポートされている場合、これは事前に定義されたマクロにHAS_ASSUME_ALIGNEDを追加します。あなたは__builtin_assume_aligned機能と同様の効果を得ることができ

注:

void foo() { 
    double *p = func_that_misses_assume_align(); 
    p = __builtin_assume_aligned(p, 128); 
    ... 
} 
+0

次に、 'assume_aligned'がヘッダーファイルでサポートされているかどうかを確認します。 – user2650277

+0

@ user2650277ありがとう、固定。 – yugr

関連する問題