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,这将给出该代码段的具体答案。但我想遵循一个通用规则。测试每一段代码似乎都是徒劳无益的,没有一个通用的规则。优化是棘手的,也是不完美的。特别是当内在论介入时。甚至有人可以详尽地调查这一点,并确定特定版本的编译器在各种常见情况下的功能,这也不是很有用,因为当您更新编译器时(更不用说使用其他供应商提供的编译器),它可能会发生更改(因此需要重新调查).希望这些都能在登记册上结束。