【问题标题】:warning: 'assume_aligned' attribute directive ignored警告:“assume_aligned”属性指令被忽略
【发布时间】:2017-06-01 08:59:16
【问题描述】:

我刚开始使用 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 语句更具体以修复编译期间的警告?

【问题讨论】:

  • 你看到了什么警告?
  • @yugr warning: 'assume_aligned' attribute directiv e ignored [-Wattributes]
  • 有趣的 [link]stackoverflow.com/questions/9608171/… 报告 __builtin_assume_aligned 已在 4 年前得到支持。虽然您的 GCC 是 2015 年的……但它应该可以工作。

标签: c++ gcc


【解决方案1】:

似乎 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);
  ...
}

【讨论】:

  • 那么我如何检查头文件是否支持assume_aligned
  • @user2650277 谢谢,已修复。
猜你喜欢
  • 1970-01-01
  • 2011-04-02
  • 1970-01-01
  • 1970-01-01
  • 2015-03-10
  • 1970-01-01
  • 1970-01-01
  • 2021-06-10
  • 1970-01-01
相关资源
最近更新 更多