【问题标题】:8 bit int vs 32 bit int on a 32 bit architechture (GCC)32 位架构 (GCC) 上的 8 位 int 与 32 位 int
【发布时间】:2015-08-03 07:33:45
【问题描述】:

在编码时,我尽量不使用比需要更多的可变内存,这导致我编写如下代码:

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 这样的编译器会在下面做任何魔术/juju 吗?

【问题讨论】:

  • 致敬!您是否尝试过查看在不同架构上生成的程序集?也许这可以提供一些见解?
  • 如果您是从微优化的角度提出这个问题,您可以使用 intfast8_t 之类的东西。
  • 这是zoozoo,不是juju... :-)
  • 如果您想确定,您应该查看程序集,但很可能您没有节省任何资源(除非您有一个数组)或获得任何性能提升。跨度>
  • 作为一个经验法则,不要过早优化,如果你想优化,一定要有理由。

标签: c gcc memory types compiler-optimization


【解决方案1】:

在大多数情况下,不会有任何内存使用差异,因为i 永远不会在内存中。 i 将被存储在一个 CPU 寄存器中,你不能真正使用一个寄存器来存储两个变量。所以i 会占用一个寄存器,uint8uint32 无所谓。

在极少数情况下,i 实际上会存储在内存中,因为循环太大以至于占用了所有 CPU 寄存器。在这种情况下,您仍然很有可能不会获得任何内存,因为其他多字节变量将被对齐,i 后面会跟着一些无用的填充字节来对齐下一个变量。

现在,如果i 实际存储在内存中,并且还有其他 8 位变量来填充填充,您可能会节省一些内存,但它太少而且不太可能,因此可能不值得。在性能方面,8 位和 32 位之间的差异非常依赖于架构,但通常是相同的。

另外,如果您在 64 位环境中工作,这种内存节省可能不存在,因为 64 位调用约定在堆栈上施加了巨大的 16 字节对齐(其中将存储 i如果它在内存中)。

【讨论】:

  • 我查看了生成的汇编代码,两者都是相同的(计数器变量在你提到的 CPU 寄存器中)谢谢
猜你喜欢
  • 2011-08-14
  • 2018-12-06
  • 2014-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-21
  • 2011-03-05
  • 1970-01-01
相关资源
最近更新 更多