首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在clang中,如何使用每个函数的优化属性?

在clang中,如何使用每个函数的优化属性?
EN

Stack Overflow用户
提问于 2014-10-09 05:31:34
回答 2查看 18.9K关注 0票数 14

我正在尝试使用clang编译一个没有优化的特定函数,以防止对memset()的某些与安全相关的调用被优化。

根据the documentation that can be found here的说法,存在一个允许这样做的optnone属性。还有,an example can be found here

不幸的是,(至少在OS X 10.9.5上的以下版本的clang上),这会导致编译器警告,如本例所示:

代码语言:javascript
运行
复制
$ clang --version
Apple LLVM version 6.0 (clang-600.0.51) (based on LLVM 3.5svn)
Target: x86_64-apple-darwin13.4.0
Thread model: posix

$ cat optnone.c
#include <string.h>

__attribute__((optnone)) void*
always_memset(void *b, int c, size_t len)
{
    return memset(b, c, len);
}

$ clang -Wall -O3 -c -o optnone.o optnone.c
optnone.c:3:16: warning: unknown attribute 'optnone' ignored [-Wattributes]
__attribute__((optnone)) void*
               ^
1 warning generated.

我也尝试过使用#pragma clang optimize off,但这导致了一个unknown pragma ignored警告。

有人知道为什么这个不起作用吗?我是否错过了使用此功能的前提条件?(我还尝试使用各种不同的-std=参数,包括c11gnu11c99gnu99,但没有改变行为。)

EN

回答 2

Stack Overflow用户

发布于 2015-08-30 10:54:58

正如clang文档所说,

Clang支持GCC的gnu属性命名空间。所有使用__attribute__((foo))语法接受的GCC属性也都被接受为[[gnu::foo]]。这只扩展到由GCC指定的属性(参见GCC函数属性、GCC变量属性、GCC类型属性列表)。与GCC实现一样,这些属性必须与声明中的声明者id相关,这意味着它们必须位于声明的开头或紧跟在被声明的名称之后。

试一试

代码语言:javascript
运行
复制
void* always_memset(void *b, int c, size_t len) [[gnu::optimize(0)]]

代码语言:javascript
运行
复制
void* always_memset(void *b, int c, size_t len) __attribute__ ((optimize("0")));
票数 6
EN

Stack Overflow用户

发布于 2017-11-18 20:20:40

正如@dulacc在他的评论中所倡导的那样,__attribute__ ((optnone))在Mac的High Sierra上使用clang 9.0.0。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26266820

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档