强制 C++ 为参数分配新地址

Noa*_*hop 1 c++ pointers reference pass-by-reference c++11

似乎当我将不同的整数直接传递给函数时,C++ 会为它们分配相同的地址,而不是将不同的地址分配给不同的值。这是设计使然,还是可以关闭的优化?有关说明,请参阅下面的代码。

#include <iostream>

const int *funct(const int &x) { return &x; }

int main() {

  int a = 3, b = 4;
  // different addresses
  std::cout << funct(a) << std::endl;
  std::cout << funct(b) << std::endl;

  // same address
  std::cout << funct(3) << std::endl;
  std::cout << funct(4) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

这个问题的更大背景是,我正在尝试构建一个指向整数的指针列表,我将逐一添加(类似于funct(3))。由于我无法修改方法定义(类似于funct's),我想存储每个参数的地址,但它们最终都具有相同的地址。

Rem*_*eau 5

该函数const int *funct(const int &x)接受绑定到int变量的引用。

abint变量,因此x可以绑定到它们,并且它们将具有不同的内存地址。

由于该函数接受const引用,这意味着编译器也将允许x绑定到临时 int变量(而非常量引用不能绑定到临时变量)。

当您将数字文字传递给x,例如funct(3),编译器会创建一个临时 int变量来保存文字值。该临时变量仅在进行函数调用的语句的生命周期内有效,然后临时变量超出范围并被销毁。

因此,当您在单独的语句中进行多次调用时,编译器可以自由地为这些临时变量重用相同的内存,例如:funct()

// same address
std::cout << funct(3) << std::endl;
std::cout << funct(4) << std::endl;
Run Code Online (Sandbox Code Playgroud)

等效于:

// same address
int temp;
{
temp = 3;
std::cout << funct(temp) << std::endl;
}
{
temp = 4;
std::cout << funct(temp) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

但是,如果您在单个语句中多次调用,编译器将被迫创建单独的临时变量,例如:funct()

// different addresses
std::cout << funct(3) << std::endl << funct(4) << std::endl;
Run Code Online (Sandbox Code Playgroud)

等效于:

// different addresses
{
int temp1 = 3;
int temp2 = 4;
std::cout << funct(temp1) << std::endl << funct(temp2) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

演示