[英]Why would you combine two 32 bit integers into a 64 bit integer?
最近我看到编译器如何组合两个32位整数,它们是类属性的值并将它们存储为64位整数。 我现在的问题是,为什么要这样做? 结合整数有什么好处?
例如,如果我们有类的以下属性
class FooBar {
int x = 1;
int y = 100;
}
而不是
i32 = 00000001
i32 = 01100100
我们得到:
i64 = 0000000101100100
你为什么要把它们合并?
现有的(正如我写的那样)答案和评论虽然部分正确,却忽略了这种优化的重点。 它是用一条指令替换两条指令(使用32位数据)(使用64位数据)。 这导致代码大小和执行时间的轻微减少。
编译器使用一条64位指令初始化两个变量(因为它们共享连续的内存地址)。 变量是分开的,将单独访问。 不需要移位或掩蔽。
当许多成员被初始化时,这在构造函数中经常出现。 一个常见的情况是零初始化,其中编译器将寄存器归零,然后使用该值初始化多个成员,将写入与连续存储器地址组合,具有更大的单个写入(例如,通过写入16位短零值而不是两个8位的)。
我相信你正在观察优化。 英特尔指令(如PADDSW
假定多个打包操作数。
https://en.wikipedia.org/wiki/X86_instruction_listings
在64位架构缓存中仅使用1个条目也有好处。
如果您只需要其中一个值,则需要解压缩成本,但我怀疑无论代码优化器运行的是什么,估计值都会有更好的节省。
以前将C结构的所有成员对齐到单词边界是正常的。 这是一个单独的char
, int
不会被打包,而是与机器的单词大小对齐。 因此, struct { char, int}
的sizeof(..)
为8个字节。 我猜这种情况有所改变?
很有意思。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.