在Agner Fog的《C++中的软件优化》中指出,union强制变量存储在内存中,即使在其他情况下它本来可以存储在寄存器中,这可能会影响性能。(例如第148页)
我经常看到这样的代码:
这很方便,但现在我想知道是否可能会有性能损失。我编写了一个小基准测试,比较了使用和不使用联合的矢量实现,在某些情况下,没有使用联合的矢量明显表现更好,尽管我不知道我的基准测试有多可信。(我比较了三种实现:联合;x、y、z、w;v[4]。例如,当按值传递时,v[4] 似乎更慢,尽管结构体的大小都相同。)
我的问题是,当编写实际生产代码时,人们是否会考虑这一点?您是否知道有哪些情况是出于这个原因而决定不使用联合的?
我经常看到这样的代码:
struct Vector {
union {
struct {
float x, y, z, w;
};
float v[4];
}
};
这很方便,但现在我想知道是否可能会有性能损失。我编写了一个小基准测试,比较了使用和不使用联合的矢量实现,在某些情况下,没有使用联合的矢量明显表现更好,尽管我不知道我的基准测试有多可信。(我比较了三种实现:联合;x、y、z、w;v[4]。例如,当按值传递时,v[4] 似乎更慢,尽管结构体的大小都相同。)
我的问题是,当编写实际生产代码时,人们是否会考虑这一点?您是否知道有哪些情况是出于这个原因而决定不使用联合的?
union
通常可以存储在寄存器中,但在这种琐碎的情况下很少发生。此外,您展示的union
在没有产生未定义行为的情况下是无用的。我建议找一本不同的书。 - nwp