展开对于
-通过为每个循环迭代制作循环体的副本来循环
编码程序展开()
编码器展开(标志)
对于我
=编码器。展开(范围
)
对于我
=编码器。展开(范围
,国旗)
编码程序展开()
展开对于
-循环。这个编码器展开
呼叫必须在紧接着对于
-使其展开的循环。
而不是生产对于
-循环在生成的代码中,循环展开生成对于
-每次循环迭代的循环体。在每次迭代中,循环索引变为常量。要展开循环,代码生成器必须能够确定循环的边界为了-
环
对于小而紧密的循环,展开可以提高性能。但是,对于大型循环,展开会显著增加代码生成时间,并生成效率低下的代码。
编码器展开
在代码生成之外被忽略。
对于
是一种传统语法,它生成的代码与我
=编码器。展开(范围
)编码程序展开()
.
对于
-环路复印对于
-循环体在生成的代码中,使用编码器展开
.
在一个文件中,编写入口点函数打电话给格特兰
和一个局部函数格特兰
.格特兰
展开对于
-将随机数分配给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的非恒定索引.