c++ - 警告 : 'assume_aligned' attribute directive ignored

标签 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 语句更具体以修复编译期间的警告?

最佳答案

似乎 assume_aligned 在 RHEL 的 GCC 中不受支持(它还没有被反向移植到上游 gcc-4_8-branch 并且在 Ubuntu 14.04 的 GCC 4.8.4 中也不可用,所以那不会令人惊讶)。

要发出更加用户友好的诊断信息,您可以在其中一个 header 中明确检查 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);
  ...
}

关于c++ - 警告 : 'assume_aligned' attribute directive ignored,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41694735/

相关文章:

c++ - 仅在 CUDA 上修改设备内存一次

c - 是什么原因导致 "left but not entered"GCC 编译器错误?

c - "the"C 标准是否指定编译器必须遵守哪个标准?

c++ - main()::__lambda1 不是 std::_Tuple_impl<1ul, main()::__lambda1> 的可访问基类

c - 在 c 库中查找重复声明的函数(单个文件)

c++ - 相邻矩阵

c++ - 如何在 C++ 中调用此 Lambda 函数

c - 如何在 C 中返回之前调用一个函数?

c++ - g++ ifstream 的类型不完整,存在正确的头文件

c++ - 我可以在我的网站上展示我使用虚幻引擎制作的游戏吗?