联合是否比现代编译器更有效?
|
考虑简单的代码:
UINT64 result;
UINT32 high, low;
...
result = ((UINT64)high << 32) | (UINT64)low;
现代编译器是将其转换为高电平时的实际偏移,还是将其优化为简单复制到正确的位置?
如果不是这样,那么使用工会似乎比大多数人似乎使用的转变更为有效。但是,让编译器进行优化是理想的解决方案。
我想知道当人们需要额外的性能时我该如何建议他们。
没有找到相关结果
已邀请:
4 个回复
盛虱
运行未优化输出the2 un的差异:
我不了解汇编程序,因此我很难对其进行分析。但是,似乎在非联盟(顶部)版本上发生了预期的变化。 但是启用优化
,输出是相同的。因此,生成了相同的代码,并且两种方式都将具有相同的性能。 (Linux / AMD64上的gcc版本4.5.2) 优化的
代码的部分输出(带有或不带有联合):
片段由
线产生的跳转后立即开始。
亥套惟间连
犀寺扦
,您无法确定将映射到哪个低/高场。考虑一下耐力。 现代编译器很好地处理了这种变化。
咳累录酬
实际上会产生未定义的结果...因为使用
,您要将32位值移动32位(值的宽度),结果将是不确定的,并且将取决于编译器和OS平台决定应对这一转变。然后,该不确定的移位的结果将与ѭ11或,由于您将一个未定义的值与定义的值进行比对,因此它也将是不确定的,因此最终结果很可能不是随心所欲的64位值。例如,OSX 10.6上的“ 2”发出的代码如下:
因此,您可以看到,移位仅发生在具有32位汇编命令的32位寄存器中的32位值上……结果最终与ѭ14same完全相同,而没有任何移位,因为在这种情况下,
只是返回in16ѭ中的原始值。您没有得到64位结果。 为了避免这种情况,请将
转换为
,例如: