32 位架构 (GCC) 上的 8 位 int 与 32 位 int
8 bit int vs 32 bit int on a 32 bit architechture (GCC)
在编码时,我尽量不使用比需要更多的变量内存,这导致我编写如下代码:
for (uint8 i = 0; i < 32; i++) {
...
}
而不是:
for (int i = 0; i < 32; i++) {
...
}
(uint8
而不是 int
因为 i
只需要上升到 32)
在 8 位微处理器上编码时,这很有意义。但是,如果 运行 此代码在 32 位微处理器上(其中 int
可能是 16 位或 32 位),我是否节省了任何资源?当我在 32 位架构上显式使用 8 位 int
时,像 GCC 这样的编译器会在下面做任何 magic/juju 吗?
在大多数情况下,不会有任何内存使用差异,因为 i
永远不会在内存中。 i
会存放在一个CPU寄存器中,你不可能真的用一个寄存器存放两个变量。所以 i
将占用一个寄存器, uint8
或 uint32
无关紧要。
在极少数情况下,i
实际上会存储在内存中,因为循环太大以至于所有CPU寄存器都被占用了。在这种情况下,你仍然很有可能不会获得任何内存,因为其他多字节变量将被对齐,并且 i
后面将跟随一些无用的填充字节来对齐下一个变量。
现在,如果 i
实际存储在内存中,并且还有其他 8 位变量来填充填充,您可能会节省一些内存,但它太小而且不太可能,它可能不是'不值得。在性能方面,8 位和 32 位之间的差异非常依赖于体系结构,但通常是相同的。
此外,如果您在 64 位环境中工作,这种内存节省可能是不存在的,因为 64 位调用约定在堆栈上强加了一个巨大的 16 字节对齐(其中 i
如果它在内存中,将被存储)。
在编码时,我尽量不使用比需要更多的变量内存,这导致我编写如下代码:
for (uint8 i = 0; i < 32; i++) {
...
}
而不是:
for (int i = 0; i < 32; i++) {
...
}
(uint8
而不是 int
因为 i
只需要上升到 32)
在 8 位微处理器上编码时,这很有意义。但是,如果 运行 此代码在 32 位微处理器上(其中 int
可能是 16 位或 32 位),我是否节省了任何资源?当我在 32 位架构上显式使用 8 位 int
时,像 GCC 这样的编译器会在下面做任何 magic/juju 吗?
在大多数情况下,不会有任何内存使用差异,因为 i
永远不会在内存中。 i
会存放在一个CPU寄存器中,你不可能真的用一个寄存器存放两个变量。所以 i
将占用一个寄存器, uint8
或 uint32
无关紧要。
在极少数情况下,i
实际上会存储在内存中,因为循环太大以至于所有CPU寄存器都被占用了。在这种情况下,你仍然很有可能不会获得任何内存,因为其他多字节变量将被对齐,并且 i
后面将跟随一些无用的填充字节来对齐下一个变量。
现在,如果 i
实际存储在内存中,并且还有其他 8 位变量来填充填充,您可能会节省一些内存,但它太小而且不太可能,它可能不是'不值得。在性能方面,8 位和 32 位之间的差异非常依赖于体系结构,但通常是相同的。
此外,如果您在 64 位环境中工作,这种内存节省可能是不存在的,因为 64 位调用约定在堆栈上强加了一个巨大的 16 字节对齐(其中 i
如果它在内存中,将被存储)。