【发布时间】:2017-07-23 17:49:24
【问题描述】:
在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存储在寄存器中,但这种情况很少发生在这种微不足道的情况下。如果不调用 UB,您所显示的联合也是无用的。我会考虑换一个book。 -
来自cppreferene.com : “从最近未编写的联合成员中读取是未定义的行为。许多编译器作为非标准语言扩展实现了该能力读取工会的非活动成员。”
-
在 Agner Fog 的“Optimizing software in C++”中,提到的内容不是在第 148 页而是在第 153 页。也许他更新了这本书?
标签: c++ unions cpu-registers