文档

编码器展开

展开对于-通过为每个循环迭代制作循环体的副本来循环

语法

编码程序展开()
编码器展开(标志)
对于=编码器。展开(范围)
对于=编码器。展开(范围,国旗)

描述

实例

编码程序展开()展开对于-循环。这个编码器展开呼叫必须在紧接着对于-使其展开的循环。

而不是生产对于-循环在生成的代码中,循环展开生成对于-每次循环迭代的循环体。在每次迭代中,循环索引变为常量。要展开循环,代码生成器必须能够确定循环的边界为了-

对于小而紧密的循环,展开可以提高性能。但是,对于大型循环,展开会显著增加代码生成时间,并生成效率低下的代码。

编码器展开在代码生成之外被忽略。

实例

编码器展开(旗帜)展开对于-循环如果旗帜符合事实的.旗帜在代码生成时计算编码器展开呼叫必须在紧接着对于-使其展开的循环。

实例

对于=编码器。展开(范围)是一种传统语法,它生成的代码与编码程序展开().

实例

对于=编码器。展开(范围,旗帜)是一种传统语法,它生成的代码与编码器展开(标志).

例子

展开对于-环路

复印对于-循环体在生成的代码中,使用编码器展开.

在一个文件中,编写入口点函数打电话给格特兰和一个局部函数格特兰.格特兰展开对于-将随机数分配给n×1数组的循环。打电话给格特兰电话格特兰值为3。

作用z=呼叫_getrand%#编码基因z=getrand(3);终止作用y=getrand(n)coder.inline(“从来没有”); y=零(n,1);编码器。展开();对于i=1:ny(i)=兰德();终止终止

生成一个静态库。

编码基因-配置:lib打电话给格特兰-报告

在生成的代码中,代码生成器生成对于-三个循环迭代的每个循环体。

静态void getrand(双y[3]){y[0]=b_rand();y[1]=b_rand();y[2]=b_rand();}

控制对于-带标志的循环展开

使用控制循环展开编码器展开旗帜论点

在一个文件中,编写入口点函数调用\u getrand\u unrollflag和一个局部函数getrand_展开标志. 循环迭代次数小于10次时,getrand_展开标志展开对于-循环。打电话给格特兰电话格特兰值为50。

作用z=调用\u getrand\u展开标志%#编码基因z=getrand_展开标志(50);终止作用y=getrand_unrollflag(n)coder.inline(“从来没有”); 展开标志=n<10;y=零(n,1);编码器展开(展开标志)对于i=1:ny(i)=兰德();终止终止

生成一个静态库。

编码基因-配置:lib调用\u getrand\u unrollflag-报告

迭代次数不少于10次。因此,代码生成器不会展开对于-循环。它产生一个对于-在生成的代码中循环。

静态void getrand_unrollfag(双y[50]){int i;for(i=0;i<50;i++){y[i]=b_rand();}

使用旧语法展开对于-环路

作用z=呼叫_getrand%#编码基因z=getrand(3);终止作用y=getrand(n)coder.inline(“从来没有”); y=零(n,1);对于i=编码器。展开(1:n)y(i)=兰德();终止终止

使用遗留语法来控制对于-循环展开

作用z=调用\u getrand\u展开标志%#编码基因z=getrand_展开标志(50);终止作用y=getrand_unrollflag(n)coder.inline(“从来没有”);展开标志=n<10;y=0(n,1);对于i=编码器。展开(1:n,展开标志)y(i)=兰德();终止终止

输入参数

全部崩溃

什么时候旗帜符合事实的,代码生成器展开对于-循环。什么时候旗帜错误的,代码生成器生成对于-在生成的代码中循环。旗帜在代码生成时计算。

提示

有时,代码生成器会展开对于-即使您不使用编码器展开. 例如,如果对于-将索引循环到异类单元格数组或瓦拉金瓦拉戈特,代码生成器展开循环。通过展开循环,代码生成器可以确定每个循环迭代的索引值。代码生成器使用试探法确定何时展开对于-循环。如果启发法无法确定展开是有保证的,或者如果循环迭代次数超过限制,代码生成将失败。在这些情况下,您可以使用编码器展开看见for循环中varargin或varargout的非恒定索引.

在R2011a中引入

这个话题有用吗?