C++ 是C++;是否善于为局部变量重用堆栈内存?

C++ 是C++;是否善于为局部变量重用堆栈内存?,c++,optimization,scope,stack,local-variables,C++,Optimization,Scope,Stack,Local Variables,考虑以下代码: const __m256d a = /* get it in some way */; const __m256d b = /* get it in some way */; const __m256d c = /* calculate as a result of operations on a and b */; const __m256d d = /* get it in some way */; const __m256d e = /* get it in some wa

考虑以下代码:

const __m256d a = /* get it in some way */;
const __m256d b = /* get it in some way */;
const __m256d c = /* calculate as a result of operations on a and b */;
const __m256d d = /* get it in some way */;
const __m256d e = /* get it in some way */;
const __m256d f = /* calculate as a result of operations on d and e */;
const __m256d g = /* calculate as a result of operations on c and f */;
这里的
\uuuu m256d
是一种长(32字节)数据类型,由4个压缩
双精度
组成。它是POD/普通和内置的(AVX)

因此,在计算了
c
之后,编译器能否以某种方式处理
a
b
,并将它们在堆栈中的内存重新用于后面的变量(
c
d
,等等)?在计算
f
之后,
d
e
的值相同

我用
const
限定变量,以帮助编译器优化(表明无需担心其值的变化)。但我可以手动管理堆栈,但代价是删除一些
const
s。要我做吗

我没有考虑重用变量名,因为这太麻烦了。相反,我将通过作用域重用堆栈:

__m256d g;
{
  __m256d c;
  {
    const __m256d a = /* get it in some way */;
    const __m256d b = /* get it in some way */;
    c = /* calculate as a result of operations on a and b */;
  }
  __m256d f;
  {
    const __m256d d = /* get it in some way */;
    const __m256d e = /* get it in some way */;
    f = /* calculate as a result of operations on d and e */;
  }
  g = /* calculate as a result of operations on c and f */;
}

我的编译器是MSVC++2017工具集v141。

LLVM使用堆栈插槽着色来重用堆栈插槽。GCC也做了类似的事情。由于这无论如何都不是一个“高科技”优化,MSVC应该拥有它

以合理的方式编写代码,然后查看反汇编以确认编译器正在执行您想要的操作。如果不是,则根据需要修改代码。@CodyGray,这将给出该代码段的具体答案。但我想遵循一个通用规则。测试每一段代码似乎都是徒劳无益的,没有一个通用的规则。优化是棘手的,也是不完美的。特别是当内在论介入时。甚至有人可以详尽地调查这一点,并确定特定版本的编译器在各种常见情况下的功能,这也不是很有用,因为当您更新编译器时(更不用说使用其他供应商提供的编译器),它可能会发生更改(因此需要重新调查).希望这些都能在登记册上结束。