>在函数(C/C++)中使用全局变量时,是直接从寄存器还是从堆栈中获取?
>为什么绑定循环(for循环)被认为比nobound循环有更多的优化空间(while while / do while)?
>为什么返回值不如通过引用传递值?
>为什么绑定循环(for循环)被认为比nobound循环有更多的优化空间(while while / do while)?
>为什么返回值不如通过引用传递值?
如果可能,plz给出装配级描述.
解决方法
1)全局变量由链接器静态分配
(它可能是模块基础的偏移,但不是
必须是固定的地址).
但是,函数通常会从中读取全局变量
直接地址和偏移堆栈指针的局部变量
和偏移对象基指针的类字段.
全局变量的值可以缓存在寄存器中
用于后续读取,除非它声明为“易失性”.
(它可能是模块基础的偏移,但不是
必须是固定的地址).
但是,函数通常会从中读取全局变量
直接地址和偏移堆栈指针的局部变量
和偏移对象基指针的类字段.
全局变量的值可以缓存在寄存器中
用于后续读取,除非它声明为“易失性”.
2)它不是真正的/ do / while选择的问题,
但它计算迭代次数有多容易,
这样编译器就能决定是否展开
和/或矢量化和/或并行化循环.
例如,这里编译器会知道数字
迭代次数:
for( i=0; i<8; i++ ) { j = 1 << i; XXX }
而这里不会:
for( j=1; j<256; j<<=1 ) { XXX }
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,s2 ); }
有关gcc / intelc的更多信息,请访问:http://nishi.dreamhosters.com/u/1.zip