警告:忽略“assume_aligned”属性指令

use*_*277 5 c++ gcc

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

\n\n
#ifdef _MSC_VER\n#define MYAPP_CACHE_ALIGNED_RETURN /* not supported */\n#else\n#define MYAPP_CACHE_ALIGNED_RETURN __attribute__((assume_aligned(64)))\n#endif\n
Run Code Online (Sandbox Code Playgroud)\n\n

我正在使用gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-11),而且它很旧。我在编译过程中收到此警告:

\n\n
 warning: 'assume_aligned' attribute directiv e ignored [-Wattributes] \xe2\x80\x93\n
Run Code Online (Sandbox Code Playgroud)\n\n

如何使 if 语句更具体以修复编译期间的警告?

\n

yug*_*ugr 3

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
Run Code Online (Sandbox Code Playgroud)

但是,如果您的发行版供应商已从上游向后移植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)
Run Code Online (Sandbox Code Playgroud)

HAS_ASSUME_ALIGNED如果编译器支持该属性,这将添加到预定义宏中。

请注意,您可以使用 __builtin_assume_aligned 函数实现类似的效果:

void foo() {
  double *p = func_that_misses_assume_align();
  p = __builtin_assume_aligned(p, 128);
  ...
}
Run Code Online (Sandbox Code Playgroud)