您的编译器可能会发出int32的代码就好了;它可能是你的架构的自然int大小(这是真的吗?sizeof(int)== 4?)。 我猜测尺寸增加来自三个地方:
使对齐工作
32位整数可能在堆栈和其他地方自然对齐, 所以通常不必发出代码以确保“ 堆栈是4字节对齐的。如果你撒了一堆16位的整数 你的代码,可能需要添加填充(帧指针的额外添加 作为修复?)通常一个添加指令覆盖帧/堆栈 维护,但可能会发出额外的指示以保证 对准。
在16位和32位整数之间进行转换
使用32位整数,大多数指令自然起作用。对于较小的整数,有时编译器必须发出切换/切片位的代码 它保留了较小的语义。 (也许做一个额外的AND指令来掩盖 关闭一些高位或OR指令来设置一些位)。
来回回忆
标准LOADS和STORES用于32位整数(可能是您机器的自然尺寸)。当它必须存储时,它是可能的 只有2个字节 而不是4,架构必须发出额外的指令来存储非标准的int(通过切断int,使用具有更长编码的奇怪指令,或使用位指令来切断指令)。
这些都是猜测。最好的方法是查看汇编代码,看看发生了什么!
为了节省空间,我尝试用int16替换相关变量。 当我构建它时,构建的大小增加了大约60个字节。
这对我来说没什么意义。使用较小的数据类型不需要转换为较少的指令。它可以在运行软件时减少内存使用,但不一定是构建大小。
因此,例如,在这里使用较小数据类型的原因可能是增加二进制文件的大小可能是因为使用较小类型需要更多指令或更长指令。例如,对于非字/双字对齐的存储器,编译器可能必须使用更多指令用于未对齐的移动。如果所有通用寄存器都较大,则可能必须使用特殊指令来提取低位/高位字。在这种情况下,除了使用较小类型增加的二进制大小之外,您可能还会获得轻微的性能损失(但在代码运行时使用的内存较少)。
可能存在许多场景,它特定于您使用的确切编译器和架构(汇编代码将揭示确切原因),但简而言之,对变量使用较小类型并不一定意味着更小的构建/更少说明,并可能很容易意味着相反。