void Animation::playAnimation() const
{
static const int index = 0;
const std::string& animationFileName =
m_animationContainer.getAnimationName(index);
static const int zOrder = -1;
static bool isLooping = false;
AnimationBank::play(animationFileName,
zOrder,
isLooping);
}
将常量局部变量定义为static
有什么好处吗?或者这是不必要的,甚至是错误的做法。
发布于 2017-06-08 22:21:05
除了@Christophe非常好的答案之外,为静态生成的代码很可能比局部变量的代码更糟糕,所以如果您感兴趣的是底层的好处,那么在现代处理器上静力学就更糟糕了。
原因是静力学必须位于内存中的某个位置,可以被所有其他线程和所有其他调用找到。这基本上意味着把它们放在全球记忆中。
多年来,与其他变量(如全局变量、静态变量和字段)相比,处理器和编译器一起具有对局部变量的显著优化访问,这是因为它们的使用非常流行。编译器可以选择将局部变量存储在CPU寄存器中,即使它没有(因此它使用调用堆栈),几乎可以肯定所有堆栈都在缓存中。访问堆栈通常是短位移寻址模式(从堆栈指针寄存器)。然而,访问全局或静态通常需要和扩展偏移量或绝对地址,因此这样做得到的指令比堆栈内存访问的等效指令要长。
尽管如此,由于静态和const的结合,编译器可能会检测到它可以在使用点替换常量值,所以使用const可能减轻了上述情况。尽管如此,你的片段至少显示了一种非限定性,所以讨论也许是热门话题。
发布于 2017-06-09 04:46:08
每次调用函数时都初始化或构造局部变量。局部变量存储在堆栈上,因此通常是线程安全的。
静态局部变量只初始化或构造一次;第一次调用该函数。本地静态变量不存储在堆栈上,因此通常不是线程安全的。
const局部变量是一个不改变的变量,每次调用函数时都初始化或构造该变量。局部变量存储在堆栈上,因此通常是线程安全的。
静态const局部变量是一个变量,它不会改变,并且只初始化或构造一次;第一次调用该函数。本地静态const变量不存储在堆栈上,因此通常不是线程安全的。
编译器可以将const变量优化为编译时间常数。
编译器可以通过将非静态变量保存在寄存器中而不是堆栈上来优化它们。
https://softwareengineering.stackexchange.com/questions/350501
复制相似问题