gpt4 book ai didi

c++ - C++ union 的性能影响

转载 作者:行者123 更新时间:2023-12-02 10:08:42 25 4
gpt4 key购买 nike

Agner Fog's "Optimizing software in C++"据说 union 强制将变量存储在内存中,即使在它本来可以存储在寄存器中的情况下,这可能会影响性能。 (例如第 148 页)

我经常看到这样的代码:

struct Vector {
union {
struct {
float x, y, z, w;
};
float v[4];
}
};

这可能非常方便,但现在我想知道是否可能会影响性能。
我写了一个小基准,比较了有和没有 union 的 Vector 实现,在那里,没有 union 的 Vector 表现得更好,尽管我不知道我的基准有多值得信赖。 (我比较了三种实现:union; x, y, z, w; v[4]。例如,v[4] 在按值传递时似乎更慢,尽管结构体都具有相同的大小。)

我现在的问题是,人们在编写实际生产代码时是否会考虑这一点?您是否知道出于这个原因专门决定反对 union 的案例?

最佳答案

看来目标是为 vector 类型的元素提供友好名称,而 union不是最好的方法。评论已经指出了未定义的行为,即使它有效,它也是一种限制优化机会的别名形式。

相反,避免整个困惑,只需添加命名元素的访问器。

struct quaternion
{
float vec[4];
float &x() { return vec[0]; }
float &y() { return vec[1]; }
float &z() { return vec[2]; }
float &w() { return vec[3]; }
const float &x() const { return vec[0]; }
const float &y() const { return vec[1]; }
const float &z() const { return vec[2]; }
const float &w() const { return vec[3]; }
}

事实上,就像 Eigen 对其四元数实现所做的一样:
https://eigen.tuxfamily.org/dox/Quaternion_8h_source.html

关于c++ - C++ union 的性能影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42581913/

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