【问题标题】:C++ - constant and optimizationC++ - 常量和优化
【发布时间】:2011-10-13 13:17:28
【问题描述】:

我正在优化我的应用程序中的一些热点,并使用gcc-arm 完成编译。

现在,以下语句是否有可能导致不同的汇编代码:

static const pixel_t roundedwhite = 4294572537U;
return (packed >= roundedwhite) ? purewhite : packed;

// OR
const pixel_t roundedwhite = 4294572537U;
return (packed >= roundedwhite) ? purewhite : packed;

// OR
return (packed >= 4294572537U) ? purewhite : packed;

我的 ARM 编译器是否有可能为第一种情况生成不需要的代码,或者是否应该对此进行优化?

我认为它几乎是一样的,但不幸的是,与普通的 gcc 相比,我不确定 gcc-arm 的作用,并且我无法访问反汇编列表。

非常感谢。

【问题讨论】:

  • 为什么要猜?编译为汇编 (-S) 并进行比较。

标签: c++ optimization gcc assembly constants


【解决方案1】:

使用-S 标志调用gcc 并查看程序集:

-S

在适当的编译阶段之后停止;不要组装。对于每个指定的非汇编程序输入文件,输出采用汇编程序代码文件的形式。

我会自己尝试将其包含在答案中,但我手边没有 ARM 编译器。

【讨论】:

    【解决方案2】:

    一个区别肯定是第一个版本,static 会占用一些内存,即使它的值会在表达式中内联。如果您想计算一次更复杂的表达式然后存储结果,这将是有意义的,但对于这个简单的常量,静态是不必要的。也就是说,编译器很可能会内联该值,因为这是一个非常简单的优化,没有理由不这样做。

    【讨论】:

    • 这就是它在函数范围之外所做的事情,但我假设因为定义是在返回之前它在函数范围内。根据cprogramming.com/tutorial/statickeyword.html:在函数内部使用静态是最简单的。它只是意味着一旦变量被初始化,它会一直保留在内存中直到程序结束。
    • @LokiAstari 你能在这里给一些详细的解释吗?
    • @Kotti:他的意思是,根据您定义static const 的位置,它可以有不同的含义。如果您在函数内部定义它,就像我假设的那样,它将分配静态内存。如果你在函数之外定义它,在 cpp 中,这将意味着静态链接,即 const 对其他文件/类不可见。
    • @inflagranti:我同意这一点。但这仍然不需要空间。变量只需要在其地址被占用时占用空间,因此在两个语句中都可以轻松优化。s
    • @inflagranti:不管是静态存储持续时间还是自动存储持续时间,它都不需要内存位置。它只是一个对象,可以完全保存在寄存器中(或内联的情况下)。它唯一需要一个位置的时间是它的地址被占用的时候。静态存储持续时间对象的语义只是意味着编译器必须在当前函数调用的上下文之外保留其状态。请参阅标准中的1.8 The C++ object model。对象具有类型/存储持续时间(以及可选的名称),它不需要内存位置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-15
    • 2019-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多