gpt4 book ai didi

c++ - 在 C++ 中声明一个局部变量 const 的好处,如果它的值在编译时是未知的

转载 作者:行者123 更新时间:2023-11-28 05:36:43 25 4
gpt4 key购买 nike

我目前正在开发一款对性能至关重要的软件,因此每次优化对我来说都很重要。在循环中经常发生一种危急情况,在该循环中,我使用 double 计算了 std::vector 的两个 int 索引(为了澄清起见,将公制位置转换为 map 位置)。

在我看来,有三种明智的方法可以做到这一点。

//first possibility

int indexX, indexY;
for(int x = 0; x <= xMax; ++x)
{
for(int y = 0; y <= yMax; ++y)
{
indexX = //calculate value using x somehow
indexY = //calculate value using y somehow
//do multiple things with indexX and indexY
}
}

//second possibility

for(int x = 0; x <= xMax; ++x)
{
for(int y = 0; y <= yMax; ++y)
{
int indexX = //calculate value using x somehow
int indexY = //calculate value using y somehow
//do multiple things with indexX and indexY
}
}

//third possibility

for(int x = 0; x <= xMax; ++x)
{
for(int y = 0; y <= yMax; ++y)
{
const int indexX = //calculate value using x somehow
const int indexY = //calculate value using y somehow
//do multiple things with indexX and indexY
}
}

在对 SO 进行一些搜索之后,人们通常似乎不推荐第一种情况,并说如果变量尽可能在本地声明,则可以进行更好的优化。我已经测试过了,到目前为止它似乎是正确的,如果在编译过程中打开了优化。

但是,我不确定案例 2/3。所有关于 const 的主题我都可以在 SO 上找到,关注使用关键字作为函数参数的修饰符,而不是局部变量。 Sell me on const correctness是关于该主题的非常笼统的讨论,主要涉及“意外错误保护”。接受的答案还指出编译器优化“是可能的”,但在我的案例中我无法观察到任何性能差异。

我知道编译器很可能会将类似 const int number = 5 的内容转换为实际数字(如 here 所述,它是 C#,但我不认为它会有所不同C++) 但是,在我的例子中,它在编译时是未知的。

编译器是否检测到局部变量只被赋值一次,从而保证对两种情况的处理相同?有没有可能一个比另一个带来更好的优化?对于一种情况,这些优化总是比另一种情况更好,还是可以在两者之间切换?可能取决于平台?

编辑:我应该提一下。代码将在“高度不同的平台”上编译,不幸的是,在大多数情况下我无法检查汇编结果。

最佳答案

很抱歉,因为它可能不是预期的答案,但是如果代码将在“高度不同的平台”上编译,您甚至不应该尝试进行这种低级优化.像往常一样,仔细检查所有算法,分析代码(在一个平台上……)以查看您将大部分时间花在哪里,然后对这些部分进行两次检查。如果还不够,直接在汇编(每个支持的目标平台一个)中编写最关键的部分。但是对于与您类似的问题,我现在假设编译器会比 C++ 程序员更聪明...

关于c++ - 在 C++ 中声明一个局部变量 const 的好处,如果它的值在编译时是未知的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38121590/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com