c++ - 使用参数优化编译器

标签 c++ optimization compiler-construction parameters

假设你在某些类中有一些函数像这样一起调用

myclass::render(int offset_x, int offset_y)
{
    otherClass.render(offset_x, offset_y)
}

这种模式可能会在 10 多个类(class)中重复一段时间,所以我的问题是:

现代 C++ 编译器是否足够聪明,可以识别程序在何处存储函数参数 - 从维基百科告诉我的内容来看,它似乎因参数大小而异,但对于 2 参数函数,处理器寄存器似乎可能 - 不需要被新值覆盖?

如果没有,我可能需要考虑实现我自己的方法

最佳答案

我认为编译器更有可能进行更大规模的优化。您必须检查实际生成的机器代码,例如以下微不足道的尝试:

#include <iostream>

class B {
public:
    void F( int x, int y ) {
        std::cout << x << ", " << y << std::endl; 
    }
};

class A {
    B b;

public:
    void F( int x, int y ) {
        b.F( x, y );
    }
};

int main() {
        A a;
        a.F( 32, 64 );
}

使编译器(VS 2010 中的 cl.exe,空项目,原始“发布”配置)生成完全内联调用树的程序集;你基本上得到“推送 40h,推送 20h,调用 std::operator<<。”

滥用 __declspec(noinline) 导致 cl.exe 意识到 A::F 只是转发给 B::F 并且 A::F 的定义只不过是“调用 A::F “根本没有堆栈或寄存器操作(因此在这种情况下,它已经执行了您所询问的优化)。但请注意,我的示例非常人为设计,因此没有说明编译器一般有能力做到这一点,只是说它可以完成。

在您的真实场景中,您必须自己检查反汇编。特别是,如果您对可能影响结果的类成员变量进行任何操作,则需要考虑“this”参数(cl.exe 通常通过 ECX 寄存器传递它)。

关于c++ - 使用参数优化编译器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3779937/

相关文章:

c# - CLR 如何优化属性引用?

C 编程 : difference between++i and i=i+1 from an assembler point of view?

c++ - 用 C 编写 Linux 服务器的最佳方法(phtreads、select 或 fork?)

c++ - 在 C++ MPI 中发送字符串

c++ - 使用std::move_iterator增强了for循环

css - 在 CSS 中使用非常具体的选择器有优势吗?

optimization - 如何在 OpenShift 3.6 中获取有关最新成功部署 pod 的信息

compiler-construction - 在堆垛机中处理临时物

ios - cmake 命令 CXX 编译器 ABI 信息失败

c++ - std::set 中的索引或位置