警告:' assume_aligned'属性指令被忽略

时间:2017-01-17 10:31:08

标签: c++ gcc

我刚开始使用C ++,我认为最好的方法是查看源代码。我在头文件中有如下代码。

#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语句更具体,以便在编译期间修复警告?

1 个答案:

答案 0 :(得分:2)

似乎RHEL的GCC不支持assume_aligned(它没有被移植到上游gcc-4_8-branch,也没有在Ubuntu 14.04的GCC 4.8.4中提供,因此不会令人惊讶)。

要发出更加用户友好的诊断信息,您可以在其中一个标题中明确检查GCC版本:

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

但是如果您的发行版供应商已经从上游反向移植assume_aligned(这不是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);
  ...
}