c++ - 编译器评估常量表达式

标签 c++ optimization

我希望我的编译器 (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/

相关文章:

c++ - 为什么在分配给 const std::string 时会复制字符串文字?

php - 如何优化这个 PHP 脚本/删除 HTML

c++ - 解决静态初始化顺序失败

c++ - 在通过 Visual C++ 应用程序执行的 msi 安装上指定 norestart

c++ - libc++ 和 libstdc++ 之间的 istream eof 差异

c++ - 如何连接两个指向字符串的指针并将其存储在数组或字符中?

php - 基于用户级别不同的mysql join查询

c++ - "used without template parameters"

c++ - 在插入之前使用 lower_bound 搜索 map 的好处。等同于 ptr_map?

c++ - 紧密循环中虚函数的成本