gpt4 book ai didi

c++ - 直接使用只读变量的性能与存储在对象中然后使用它的性能不同吗?

转载 作者:太空狗 更新时间:2023-10-29 21:20:39 26 4
gpt4 key购买 nike

我有一个类似于此的简单函数:

int foo(const Data& a, int pos)
{
Big_obj x= (pos==1?a.x : a.y);//I just use x for reading
return x.elem*x.elem;
}

(假设我忘记通过引用存储对象 const Big_obj& x=...)

今天的编译器可以将其优化为以下代码吗? :

int foo(const Data& a, int pos)
{
if (pos == 1)
return a.x.elem * a.x.elem;
else
return a.y.elem * a.y.elem;
}

最佳答案

GCC 有一个非常有用的编译器开关:-fdump-tree-optimized 它将在执行优化后显示代码。

你会发现这一切都依赖于Big_obj

例如

struct Big_obj
{
int elem;
int vect[1000];
};

struct Data { Big_obj x, y; };

g++ -Wall -O3 -fdump-tree-optimized 将生成一个 .165t.optimized 文件,其中包含:

int foo(const Data&, int) (const struct Data & a, int pos)
{
int x$elem;
const struct Big_obj * iftmp.4;
int _8;

<bb 2>:
if (pos_2(D) == 1)
goto <bb 3>;
else
goto <bb 4>;

<bb 3>:
iftmp.4_4 = &a_3(D)->x;
goto <bb 5>;

<bb 4>:
iftmp.4_5 = &a_3(D)->y;

<bb 5>:
# iftmp.4_1 = PHI <iftmp.4_4(3), iftmp.4_5(4)>
x$elem_7 = MEM[(const struct Big_obj &)iftmp.4_1];
_8 = x$elem_7 * x$elem_7;
return _8;
}

这正是您发布的优化代码。但是,如果您更改 Big_obj(vect 类型已从数组更改为 std::vector):

struct Big_obj
{
int elem;
std::vector<int> vect;
};

不会再执行优化(即 foo() 还将为 x.vect 分配/取消分配内存)。

在示例中,原因是必须根据 as-if rule 实现优化: 只允许不改变程序可观察行为的代码转换。

operator new 可以有一个自定义 实现来计算它被调用的次数(这很难检测到)。但即使没有自定义 operator new,也存在其他问题(参见 Does allocating memory and then releasing constitute a side effect in a C++ program?)。

对于其他编译器,您必须研究汇编代码(例如 clang++ -S 开关),但同样如此。

关于c++ - 直接使用只读变量的性能与存储在对象中然后使用它的性能不同吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24095378/

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