声明引用是常规指令还是第二个名称?

时间:2011-08-01 11:48:41

标签: c++ reference

当我写作时,

T &t = obj;

这被认为是一条指令(生成机器代码)还是第二个名称obj

4 个答案:

答案 0 :(得分:6)

除了生成的代码之外,我认为标准不会使用word指令。行T &t = obj;是一个声明语句,它是一个定义;这是一个陈述,但using std::string;之类的东西也是如此。它可能会也可能不会导致生成可执行代码,具体取决于很多事情。

另外(由于你的头衔):T &t = obj;中没有作业。

答案 1 :(得分:5)

这取决于。如果优化器能够完全消除T,则不会生成任何机器代码。否则,可能会有。

如果您真的关心某些特定代码的答案,请按照通常的方式编译代码(相同的编译器,相同的优化选项等),但让编译器生成汇编代码。然后检查汇编代码以找出答案。

答案 2 :(得分:2)

正如詹姆斯所说,代码生成不是语言标准的一部分,所以在语言的上下文中没有答案。

实际上,特别是如果你有任何类型的优化,完全有可能并且可以预期具有自动存储的变量实际上根本不会导致任何汇编输出,原因有很多 - 或者值可以是由编译器推断,或类似指针的值(如引用)引用同一范围内的某些内容,并且编译器已经知道如何访问该数据,因此不需要在该数据库中创建相同地址值的多个副本。机器水平。

几乎可以肯定的典型示例会导致生成额外的代码:

int a = 2875;
char * const pa = reinterpret_cast<char*>(&a); // no code
int & ra = a;                                  // no code

double arr[10];
double & rd = arr[5];                          // no code

std::map<int, std::string> m;
const std::string & s = m.find(8)->second;     // ? ... ->
return foo(s);                                 // ... -> probably no code for s

答案 3 :(得分:0)

它生成机器代码。 t将采用obj的有效地址。您可以将编译器设置为生成程序集并自行检查。在Windows上,这是生成的:

lea eax,DWORD PTR _obj $ [ebp]
mov DWORD PTR _t $ [ebp],eax