繁体   English   中英

为什么要将两个32位整数组合成64位整数?

[英]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结构的所有成员对齐到单词边界是正常的。 这是一个单独的charint不会被打包,而是与机器的单词大小对齐。 因此, struct { char, int}sizeof(..)为8个字节。 我猜这种情况有所改变?

很有意思。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM