【发布时间】:2016-05-13 10:54:16
【问题描述】:
我对 GCC 的优化标志及其工作方式有疑问。
我有一段很长的代码,它使用了所有本地数组和变量。在代码的最后,我将本地数组的内容复制到一个全局数组中。这是我的代码的一个非常精简的示例:
uint8_t globalArray[16]={0};
void func()
{
unsigned char localArray[16]={0};
for (int r=0; r<1000000; r++)
{
**manipulate localArray with a lot of calculations**
}
memcpy(&globalArray,localArray,16);
}
以下是三种不同场景下代码的大致速度:
无“-O3”优化:3.203s
使用“-O3”优化:1.457s
有“-O3”优化和没有最后的
memcpy(&globalArray,localArray,16);语句:0.015s
无需将本地数组复制到全局数组中,代码运行速度几乎快了 100 倍。我知道全局数组存储在内存中,本地数组存储在寄存器中。我的问题是:
为什么仅将本地数组的 16 个元素复制到全局数组会导致执行速度降低 100 倍?我已经搜索了这个论坛和在线,我找不到我的这个特定场景的明确答案。
有什么方法可以在不损失速度的情况下提取局部变量的内容?
提前感谢任何可以帮助我解决此问题的人。
【问题讨论】:
-
在情况 3 中,编译器可能删除了所有计算,因为它们不会导致可观察到的行为。您可以通过检查汇编代码来验证这一点
-
您还可以从函数返回 localArray 指针,这也将阻止编译器优化函数的全部内容。这将提供更好的比较。
-
@Conor 这是未定义的行为。
-
@TartanLama,是的,你当然是对的,也许更好地传入 GlobalArray 并填充它?这样你就可以看到有没有 memcpy 的区别
-
@TartanLlama 不,不是。使用返回的指针将是 UB,但仅返回它不会。我怀疑它会禁用优化。
标签: c++ arrays performance gcc compiler-optimization