编译器会优化和重用变量吗?

Zis*_*Zis 1 c++ optimization gcc clang

例如,如果我有以下代码:

int main(){
  myClass a(...);
  a.doSomething();
  if(...){
    myClass c(...);
    c.doSomething();
  }
}
Run Code Online (Sandbox Code Playgroud)

像gcc或clang这样的通常编译器会优化这些变量的使用,发现"a"在它的生命周期中将不再使用,而不是为"c"重新分配空间,只需使用空间?如果这对于类不起作用,那么对于像double或size_t这样的"传统"类型是否有效?

我正在尝试最小化频繁调用函数的分配成本.但是在函数内部的某个地方,我觉得一些旧的变量已经没用了,但新变量不应该被称为该名称.编译器会直接重用变量给我,还是应该做类似的事情

myClass a(...);
something(a);
if(...){
  #define c a
  c=myClass(...);
  something c;
  #undef c
}
Run Code Online (Sandbox Code Playgroud)

das*_*ght 5

通常,不允许编译器a在其作用域结束时重用,这是}函数末尾的结束括号.当析构函数执行某些特殊代码*时,此功能(在可预测的时间销毁对象)可以在C++中生成警卫.

我正在尝试最小化频繁调用函数的分配成本.

由于分配自动变量的成本几乎为零,因此大部分成本是在调用构造函数时.这不是你可以优化的东西.

*如果你的对象有简单的析构函数,编译器可以重用内存.这会节省你的记忆,而不是时间.