gpt4 book ai didi

c++ - G++ : Moving to another translation unit breaks "const optimization"?

转载 作者:行者123 更新时间:2023-11-28 00:17:20 25 4
gpt4 key购买 nike

我正在处理演示各种 C++ 优化的演示文稿,并坚持使用 const 的示例允许他们。

考虑以下代码:

object.h

class Object {
int i1;
int i2;
public:
Object(int i1_, int i2_) : i1(i1_), i2(i2_) {}

int getI1() const { return i1; }
int getI2() const { return i2; }

std::pair<int, int> calculate() const {
return std::pair<int, int>(i1 + i2, i1 * i2);
}
};

constopt.cpp

#include <iostream>
#include "object.h"

int main() {
Object o(10, 20);

std::cout << o.getI1() << " + " << o.getI2() << " = "
<< o.calculate().first << std::endl
<< o.getI1() << " * " << o.getI2() << " = "
<< o.calculate().second << std::endl;

return 0;
}

calculate()是内联的,一切正常,G++ 直接将常量(10 和 20)传递给 operator <<缓存 getI1()getI2()调用:

mov    $0xa,%esi
mov $0x601080,%edi
callq 0x400740 <_ZNSolsEi@plt>

但是当我移动calculate()到一个单独的翻译单元,它强制i1i2获取两次(在 o.calculate().first 之前和之后):

mov    (%rsp),%esi
mov 0x4(%rsp),%r14d
mov $0x601080,%edi
callq 0x400740 <_ZNSolsEi@plt>

我看不出有什么不同,因为getI1()不依赖于 calculate() 可能产生的任何副作用和 Object即使在 calculate() 时也是 const在单独的翻译单元中。

是 G++ 不够聪明还是没有资格在这种情况下执行优化?我的猜测是它可以缓存getI1()getI2()电话来自那个答案:How does const after a function optimize the program?

我使用 gcc 4.8.1 版。 -Os 和 -O2 我都试过了。


似乎const在这种情况下,不在 GCC 优化器中使用。相反,它会自己挖掘(不能在不同的翻译单元中执行),并搜索 pure and const functions .函数可以手动标记为 __attribute__((const)) .消除额外的阶段 getI*()调用称为 FRE(完全冗余消除)。

最佳答案

好吧,要准确回答您的问题,必须了解编译器的实现细节。我不知道,所以接下来的内容纯属推测。

Object::i1Object::i2 未声明为常量。因此,编译器在没有看到 Object::calculate 的定义的情况下,不得不假定它们可能会发生变化。

Object::calculate 本身是 const 本身并不排除它对 Object::i1Object::i2 进行更改.考虑以下稍作修改的示例:

class Object {
int i1;
int i2;
int* p1;
public:
Object(int i1_, int i2_) : i1(i1_), i2(i2_), p1(&i1) {}

int getI1() const { return i1; }
int getI2() const { return i2; }

std::pair<int, int> calculate() const;
};

std::pair<int, int> Object::calculate() const {
(*p1)++;
return std::pair<int, int>(i1 + i2, i1 * i2);
}

此外,o 一开始就没有声明为 const,因此 Object::calculate 有权做一些像 const_cast 这样粗鲁的事情并摆脱它!

关于c++ - G++ : Moving to another translation unit breaks "const optimization"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29419563/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com