我希望我的编译器 (VS 2013) 最好通过在编译时计算一次以下内容来避免任何冗余算术计算。
基本上我看到以下三种情况:
例如:
void Mesh::Draw1()
{
const static uint32_t gStaticOffset = 0;
const static uint32_t gVertexSize = sizeof(float) * 3;
const static uint32_t gBoneIndexSize = sizeof(uint32_t) * MAX_BONES;
const static uint32_t gBoneWeightSize = sizeof(float) * MAX_BONES;
...
}
对比
void Mesh::Draw2()
{
const uint32_t staticOffset = 0;
const uint32_t vertexSize = sizeof(float) * 3;
const uint32_t boneIndexSize = sizeof(uint32_t) * MAX_BONES;
const uint32_t boneWeightSize = sizeof(float) * MAX_BONES;
...
}
对比
const static uint32_t gStaticOffset = 0;
const static uint32_t gVertexSize = sizeof(float) * 3;
const static uint32_t gBoneIndexSize = sizeof(uint32_t) * MAX_BONES;
const static uint32_t gBoneWeightSize = sizeof(float) * MAX_BONES;
void Mesh::Draw3()
{
...
}
我的想法,如有错误请指正:
Draw1()
可能会在每次函数调用时重新计算局部表达式 取决于编译器Draw2()
和Draw3()
保证表达式只计算一次, 如果不在编译时,那么在运行时- 三种变体的表达式是否会是 在编译时评估完全取决于编译器
编译器会为它们中的每一个生成不同的代码吗?如果是,哪个可以避免最冗余的计算?
最佳答案
除非您尝试,否则无法确定您的编译器将做什么。编译所有三个代码示例,然后查看生成的目标代码。
实际上,它们应该都是相同的。在编译器优化方面,常量折叠几乎是最容易实现的成果。如果您的编译器不在编译时计算这些常量,那么它不是优化编译器。除非您有非常充分的理由继续使用它,否则您应该将它扔进垃圾堆并找到一个不同的垃圾堆。
关于c++ - 编译器评估常量表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35633377/