C++/C组装级问题

Pap*_*ppu 7 c++ assembly

  1. 在函数(C/C++)中使用全局变量时,是直接从寄存器还是从堆栈中获取?

  2. 为什么绑定循环(for循环)被认为比nobound循环有更多的优化空间(while while/do while)?

  3. 为什么返回值不如通过引用传递值?

如果可能,plz给出汇编级描述.

She*_*ien 1

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