在函数(C/C++)中使用全局变量时,是直接从寄存器还是从堆栈中获取?
为什么绑定循环(for循环)被认为比nobound循环有更多的优化空间(while while/do while)?
为什么返回值不如通过引用传递值?
如果可能,plz给出汇编级描述.
1)全局变量由链接器静态分配(虽然它可以是相对于模块基址的偏移量,但不一定是固定地址)。尽管如此,函数通常会从直接地址读取全局变量,从偏移+堆栈指针读取局部变量,从偏移+对象基指针读取类字段。全局变量的值可以缓存在寄存器中以供后续读取,除非其声明为“易失性”。
2)这实际上并不是 for/do/while 选择的问题,而是计算迭代次数的容易程度,以便编译器能够决定是否展开和/或向量化和/或并行化循环。例如,这里编译器会知道迭代次数:
for( i=0; i<8; i++ ) { j = 1 << i; XXX }
Run Code Online (Sandbox Code Playgroud)
在这里它不会:
for( j=1; j<256; j<<=1 ) { XXX }
Run Code Online (Sandbox Code Playgroud)
for 循环可能只是更频繁地具有编译器更容易理解的结构。
3)如果它是基本类型的值(char/short/int等),则 通过引用返回它的速度较慢(尽管有时编译器可以对此进行优化)。但对于较大的结构,引用/指针可以减少编译器的工作量,如果编译器无法避免创建一些临时副本等,那么它确实可能会更快。
更新:好的,这是一个更具体的示例:
#include <stdio.h>
int main( void ) {
int a,b, i,j,s1,s2;
a = 123 + printf(""); // unknown in compile time
s1 = 1;
// bit reverse loop v1, gets unrolled
for( i=0; i<8; i++ ) { j = 1 << i; s1 += s1 + ((a&j)>0); }
s1 -= 256;
b = s1 + printf("");
// bit reverse loop v2, not unrolled
for( s2=1; s2<256; s2+=s2+(j>0) ) { j = b & s2; b -= j; }
s2 -= 256;
printf( "a=%02X s1=%02X s2=%02X\n", a, s1, s2 );
}
Run Code Online (Sandbox Code Playgroud)
gcc/intelc 的 Asm 列表可在此处找到:http ://nishi.dreamhosters.com/u/1.zip