gpt4 book ai didi

c++ - 引用通常会被优化掉吗?

转载 作者:太空宇宙 更新时间:2023-11-04 15:13:28 25 4
gpt4 key购买 nike

考虑这段代码示例:

// Static variables
void Object::f_v1()
{
static const int& foo = dataObjectConstRef.dataField.foo;
static const int& bar = dataObjectConstRef.dataField.bar;
static const int& baz = dataObjectConstRef.dataField.baz;
return foo * foo + baz * bar + baz / bar + baz;
}

// References
void Object::f_v2()
{
const int& foo = dataObjectConstRef.dataField.foo;
const int& bar = dataObjectConstRef.dataField.bar;
const int& baz = dataObjectConstRef.dataField.baz;
return foo * foo + baz * bar + baz / bar + baz;
}

// Everything written out
void Object::f_v3()
{
return dataObjectConstRef.dataField.foo * dataObjectConstRef.dataField.foo +
dataObjectConstRef.dataField.baz * dataObjectConstRef.dataField.bar +
dataObjectConstRef.dataField.baz / dataObjectConstRef.dataField.bar +
dataObjectConstRef.dataField.baz;
}

如果启用了编译器优化,其中哪一项性能最佳?

  • 静态版本只构建引用一次,但总是之后检查互斥锁。
  • 正常引用版本应该只计算一次地址,但是快捷方式是在此版本或上一个版本中完全优化版本?
    • 如果不是,什么更快,每次检查互斥锁或生成引用?

我正在使用带有 -O3 的 gcc 7.1。

最佳答案

Are references usually optimized away?

如果可以的话,是的,它们通常会被优化掉。

f_v1 与其他行为不同,除非 dataObjectConstRef 本身引用静态对象。由于在从多个线程调用该函数时需要同步,它也有一些性能损失。根据经验:线程同步往往比指针/引用的分配慢。但衡量它是否重要。

假设这些字段实际上具有 int 类型(因此不涉及转换)f_v2f_v3 具有相同的行为。编译器应该很容易证明这一点,我希望优化编译器能够为两者生成完全相同的代码。

关于c++ - 引用通常会被优化掉吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44242597/

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