6

char在 C 中使用小整数有什么缺点吗?除了占用/内存优势之外,还有其他优势吗?

特别是,处理器在处理整数运算时是否可能比在 ( / )上char更好或更差?longshortint

我知道这将是特定于处理器/系统/编译器的,但我希望在一般情况下得到答案,或者至少是 32 位 Windows 和 Solaris 的一般情况,即我目前正在开发的系统. 我还假设已经处理了诸如溢出/环绕问题之类的问题。

更新:Visual Studio 6.0 实际上并没有stdint.hChristoph 建议的那样。在 Windows(VS 6.0,调试版本,32 位)上使用少量堆栈循环进行一点基准测试可以提供类似intlong性能,大约是char. 在 Linux 上运行相同的测试,使用 gcc 类似地钉intlong类似地,并且都比 快char,尽管差异不那么明显。

作为旁注,我没有花太多时间寻找,但我发现(通过Wikipedia )的 VS 6.0的第一个实现stdint.h定义为,尽管至少在我的测试中这似乎更慢。因此,正如克里斯托夫正确地建议的那样,这个故事的寓意是:永远标杆!uint_fast8_tunsigned char

4

6 回答 6

12

C99 添加了所谓的“最快”最小宽度整数类型来解决这个问题。对于您感兴趣的范围,类型为int_fast8_tuint_fast8_t,可以在 中找到stdint.h

请记住,可能没有性能提升(内存消耗的增加甚至可能减慢速度);一如既往,基准!不要过早地优化或仅根据可能有缺陷的假设进行优化。

于 2009-12-06T13:02:51.733 回答
6

嗯,第一个问题是 C 标准没有定义 plainchar是有符号还是无符号的 - 所以你可以移植依赖的唯一范围是 0 到 127。

除此之外,通常int应该是与架构的本机字长相对应的类型(但当然这不是由任何东西强制执行的)。这往往是算术性能最好的类型,但这就是你所能说的。

请注意,无论是在表达式求值期间还是在表达式求值期间,窄于 的操作数int都会被加宽。intunsigned int

于 2009-12-06T12:15:52.843 回答
3

我能想到的另一个问题是(据我所知)“现代”处理器以“完整”整数(通常为 32 位)进行所有数学运算。所以处理achar通常意味着从内存中拉出一个字节,在传输到寄存器时用0填充,用它做一些事情,然后只将结果的最低有效位压缩回内存。特别是如果char没有在方便的边界上对齐,则此内存访问需要做更多的工作才能完成。

仅当您有很多数字(即一个大数组)并且您需要节省空间时,使用charfor才真正有用。int

于 2009-12-06T12:20:33.863 回答
3

几乎可以肯定,chars 上的算术实际上将使用与 int 上的算术相同的寄存器来执行。例如:

char c1 = 1;
char c2 = c1 + 2;

使用 VC++ 编译为以下内容:

00401030   movsx       eax,byte ptr [ebp-4]
00401034   add         eax,2
00401037   mov         byte ptr [ebp-0Ch],al

其中 eax 是一个 32 位寄存器。

因此,在算术性能方面,使用字符而不是整数没有优势。

于 2009-12-06T12:27:49.853 回答
2

在内部,处理器通常对机器字执行算术运算。这意味着在执行其他类型的计算时,尽管计算本身将花费相同的时间,但取决于可用的指令集,可能需要做额外的工作来读取输入并将计算结果强制转换为目标类型(例如符号扩展/零填充,移位/屏蔽以避免未对齐的内存访问等)。

这就是 C 定义类型和操作的原因 -int标准没有强制要求的大小,允许编译器作者使其对应于机器字,并且定义表达式评估以将较小的整数类型提升为int,大大减少了数量必须将结果强制转换为某种目标类型的点数。

用于存储整数值的有效理由char是,当空间真的很重要(不像您想象的那么频繁)时,以及在描述您正在编组数据的某些外部数据格式/协议时。预计使用char会导致轻微的性能损失,尤其是在 Cell SPU 等硬件上,其中只有机器字大小的内存访问可用,因此访问内存中的 char 需要多次移位和掩码。

于 2009-12-06T12:22:03.110 回答
0

我会看到的主要问题是,您的代码使用的类型对具有其他含义的值意味着一件事——例如,存在可能是维护问题的语义问题。如果你这样做了,我可能会建议对它进行类型定义:

typedef char REALLYSHORT;

这样,A) 更清楚您在做什么,并且 B) 如果遇到麻烦,您可以轻松更改它(例如,只有一个地方)。

真的有充分的理由不使用int吗?

于 2009-12-06T12:17:01.047 回答