0

如果我定义一个类的静态实例,编译器(特别是 g++/clang)是否有优化以在直接或间接访问数据成员(我的意思是公式)时省略base寄存器(用于调用)并且只对所有这些成员使用单个常量?所有成员函数都可能变成静态的(如果是类的唯一实例,这是合理的)。this[base + index * scale + displacement]displacement

我无法检查这一点,因为在 godbolt.org 编译器上积极优化以下代码xor eax, eax; ret

struct A
{

    int i;
    void f()
    {
        ++i;
    }

};

static A a;

int main(int argc, char * argv[])
{
    a.i = argc;
}
4

1 回答 1

2

简短的回答:也许。

长答案:现代编译器当然有能力优化获取this指针,并且使用复杂的寻址模式绝对是我所知道的所有现代编译器的能力范围内(包括但不限于:gcc、clang 和 MS视觉 C)。

特定编译器是否选择在特定构造上这样做取决于编译器“理解”呈现给它的代码的程度。正如您刚刚体验的那样,编译器会删除您的所有代码,因为它实际上并没有“做”任何事情。您只是分配了一个不再使用的全局结构的成员,因此编译器可以推断“好吧,您再也不会使用它,所以我不会那样做”。Remove static,编译器不知道它没有在其他地方使用是合理的。或打印 的值a.i,或将其传递给无法内联的外部函数等。

在您的示例中,我真的只是希望编译器将 的值存储argc到 的地址中a.i,这可能可以通过两条指令完成,argc从堆栈移动到寄存器,然后将该寄存器移动到计算的内存中a.i- 这是根据编译器,可能是一个常量地址。所以在这种情况下不需要花哨的寻址模式。

于 2018-03-14T07:00:54.827 回答