C++ 联合的性能影响
Performance implications of C++ unions
在 Agner Fog's "Optimizing software in C++" 中指出 union 强制将变量存储在内存中,即使在其他情况下它可能已存储在寄存器中,这可能有性能影响。 (例如第 148 页)
我经常看到这样的代码:
struct Vector {
union {
struct {
float x, y, z, w;
};
float v[4];
}
};
这可能非常方便,但现在我想知道是否可能会影响性能。
我写了一个小的基准来比较有和没有联合的 Vector 实现,在没有联合的 Vector 明显表现更好的情况下,尽管我不知道我的基准有多值得信赖。 (我比较了三个实现:union; x, y, z, w; v[4]。例如,v[4] 在按值传递时似乎更慢,尽管结构都具有相同的大小。)
我现在的问题是,这是否是人们在编写实际生产代码时考虑的事情?您是否知道出于这个原因特别决定反对工会的案例?
目标似乎是为向量类型的元素提供友好的名称,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
My question now is, whether this is something that people consider when writing actual production code?
没有。这是过早的优化(union
构造本身也是)。一旦代码以某种程度上干净可靠的方式编写,就可以对其进行概要分析并解决真正的瓶颈。无需在 some union
以上推理 5 分钟来猜测它是否会影响未来某处的性能。它要么会,要么不会,只有分析才能知道。
在 Agner Fog's "Optimizing software in C++" 中指出 union 强制将变量存储在内存中,即使在其他情况下它可能已存储在寄存器中,这可能有性能影响。 (例如第 148 页)
我经常看到这样的代码:
struct Vector {
union {
struct {
float x, y, z, w;
};
float v[4];
}
};
这可能非常方便,但现在我想知道是否可能会影响性能。 我写了一个小的基准来比较有和没有联合的 Vector 实现,在没有联合的 Vector 明显表现更好的情况下,尽管我不知道我的基准有多值得信赖。 (我比较了三个实现:union; x, y, z, w; v[4]。例如,v[4] 在按值传递时似乎更慢,尽管结构都具有相同的大小。)
我现在的问题是,这是否是人们在编写实际生产代码时考虑的事情?您是否知道出于这个原因特别决定反对工会的案例?
目标似乎是为向量类型的元素提供友好的名称,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
My question now is, whether this is something that people consider when writing actual production code?
没有。这是过早的优化(union
构造本身也是)。一旦代码以某种程度上干净可靠的方式编写,就可以对其进行概要分析并解决真正的瓶颈。无需在 some union
以上推理 5 分钟来猜测它是否会影响未来某处的性能。它要么会,要么不会,只有分析才能知道。