C/C++ – 组装级问题

前端之家收集整理的这篇文章主要介绍了C/C++ – 组装级问题前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
>在函数(C/C++)中使用全局变量时,是直接从寄存器还是从堆栈中获取
>为什么绑定循环(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

猜你在找的C&C++相关文章