- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在做一些研究并遇到了 this article它很好地描述了 restrict
关键字,因此我认为我对它的有效用法有了很好的理解。引用文章对 restrict
定义的引用:
A new feature of C99: The restrict type qualifier allows programs to be written so that translators can produce significantly faster executables. [...] Anyone for whom this is not a concern can safely ignore this feature of the language. -- From Rationale for International Standard - Programming Languages - C [std.dkuug.dk] (6.7.3.1 Formal definition of restrict)
在我的例子中,这恰好是真的;我正在编写嵌入式代码,这可能会为更高性能的编译代码带来好处,但我对汇编不够满意,无法利用它来寻求帮助。所以我正在考虑在适当的地方使用 restrict
。具体来说,我有几个循环并采用相同类型的指针参数的函数,因此从表面上看,我的代码似乎可以从中受益。
然而,文章指出:
You should expect code where all aliasing information is declared with the restrict keyword to almost always perform significantly better, and never worse, than with unrestricted pointers. This is especially true on superscalar RISC, or RISC-like architectures with large register files, like the PowerPC or MIPS R4000.
我正在使用带有 GCC 工具链的 ARM Cortex-M4。我对各种处理器架构没有足够的了解,无法将 large register files
的含义与我的用例进行比较,但鉴于给出的示例处理器和快速的 Google 搜索,我很确定我不' 构成该列表,尽管可能是应用程序类 ARM 处理器。
考虑到所有这些,我会看到微优化之外的好处吗?我完全希望以一种或另一种方式对其进行分析,但我想知道 restrict
在 ARM Cortex-M4/GCC 上下文中的定性影响,特别是它的管道是否可以利用更改或是否有其他一些因素会阻止主要好处,例如无法安排内存访问。
最佳答案
Restrict
关键字允许编译器移除程序中某些内存操作之间的依赖关系。这为大量优化提供了机会,例如更严格的指令调度(这反过来又可以从循环展开中获得更高的 yield )、自动矢量化或将多个标量加载/存储组合到矢量化变体(ldm
/stm
在 ARM 的情况下)。
上层的乱序架构(例如 ARM 中的 Cortex-A)非常努力地(并花费了大量的精力)在运行时通过动态分析和重新排序指令流(即使在那里restrict
可能会启用更高级别的优化,例如自动矢量化)。像 M4 这样的低端嵌入式内核缺乏此类功能,因此 restrict
注释对于那里的性能绝对至关重要。
正如其他评论者所指出的,restrict
的语义并非微不足道,因此我建议仅在热循环中使用它。
关于c - 在 ARM 中使用 'restrict' 关键字会改进我的代码吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26442620/
在 NHibernate 中创建条件时我可以使用 Restriction.In() 或 限制.InG() 它们有什么区别? 最佳答案 InG 是 In 的通用等价物(对于集合) 方法的签名如下(仅显示
我创建了一个 Hibernate (3.5) 条件查询: Criteria criteria = db.getSession().createCriteria(Vendor.class); crite
我对这个指令定义对象感到困惑 - (restrict)。我创建了两个函数,第一个是带有 restrict 的函数,另一个是没有 restrict 的函数。 当我运行此代码时,两个指令返回相同的结果。
这些陈述是否相同?如果我删除 owl:Restriction 会有什么问题吗?和 owl:Class .它们似乎多余,但这总是我在网上看到的例子。 owl:onProperty有域名owl:restr
下面是我开发的表格 create table userevent(id uuid,eventtype text,sourceip text,user text,sessionid text,rolei
这个问题已经有答案了: Access restriction on class due to restriction on required library rt.jar? (15 个回答) Acce
方法说明: Given a list of futures fs, returns the future holding the list of values of all the futures f
我想知道是否可以将 restrict 关键字仅包含在函数定义中,而不是像这样的函数声明中: void foo(char *bar); void foo(char * restrict bar) {
Advertisements advertisements = NHibernateSession.CreateCriteria(typeof(Advertisements))
我有以下结构: typedef struct{ int data[LENGTH]; }Data; 并像这样使用它: Data* dt=CALLOC(...) int foo(Data* res
我有以下结构: typedef struct{ int data[LENGTH]; }Data; 然后像这样使用它: Data* dt=CALLOC(...) int foo(Data* re
有以下结构: typedef struct test_def { int a, b, c; } test_def_t; typedef struct test { test_def_t con
我阅读了标准但仍然不能确定: #include #include void repl(char *restrict ap){ char *cp=strchr(ap,(int)'m');
我注意到在我们的一个遗留项目中大量使用了 restrict 关键字。 我理解 restrict 的基本原理,但我质疑它在应用于其中一些功能时是否有用。 举下面两个例子: void funcA(int
我有以下简单的功能 static inline void minVec(const double *restrict v, double *restrict vmin, unsigned length
添加到 C99 中的 restrict 关键字的主要用途之一是允许编译器将某些内容加载到寄存器中,并假定该寄存器将反射(reflect)如此加载的变量的状态。给定 void foo1(int * re
RESTRICT 和 NO ACTION 在 MySQL FK 中有什么区别?从文档来看,它们似乎完全相同。是这样吗?如果有,为什么两者都有? 最佳答案 来自 MySQL 文档:https://dev
我有一些通过apply from: 'my-build.gradle'应用的Gradle脚本。如果我在外部构建文件my-build.gradle中按如下方式使用新的插件DSL,它将失败并显示以下错误:
我正在浏览 Wikipedia/Restrict , 并发现 The compiler can e.g. rearrange the code, first loading all memory lo
根据eslint no-restricted-imports documentation When using the object form, you can also specify an arr
我是一名优秀的程序员,十分优秀!