繁体   English   中英

使用最小的必要 C 类型与仅使用 int

[英]Using smallest necessary C type vs just using int

给定一个 C 函数(随机示例):

void* getMyStuff( size_t size, unsigned char alignment );

使用unsigned char是通过告诉编译器传递的值的限制来帮助编译器,还是通过阻止编译器使用本机int (或unsigned int )大小来阻碍编译器?

我知道历史上使用short并不理想,因为 16 位操作不是原生的。 我不知道这是否适用于这里(或一般的局部变量)。

基本上,如果您传递小于 32 位的值,这可能适合较小的数据类型,编译器是否关心您选择哪个?

作为参考,我正在使用 GCC 和 Clang,编译 C11(不是 C++11)代码。 这个问题可能是特定于 ABI 的,但我不知道如何确定。

编辑:如果重要的话,我正在 x86_64 上开发。 我希望答案不会因 CPU 供应商而异。

使用 unsigned char 是通过告诉编译器传递的值的限制来帮助编译器,还是通过阻止编译器使用本机 int(或 unsigned int)大小来阻碍编译器?

取决于 CPU 和 ABI。 最有效的方法完全取决于 ABI 记录为最快的调用约定。

通常,高端 CPU 喜欢使用他们喜欢的数据宽度和对齐方式。 32 位用于 32 位 CPU 等等。 然而,它们可能支持对较小类型的操作。 低端 CPU(8 位或 16 位)根本不喜欢更大的类型,如果可能,通常更喜欢使用 8 位类型。

我知道历史上使用 short 并不理想,因为 16 位操作不是原生的。

不是本地人在哪里 16 位操作在所有 16 位 CPU 上都是完美的“本机”。 它们可能不适用于某些 32 位数据,对 16 位数据的指令支持较差。

基本上,如果您传递小于 32 位的值,这可能适合较小的数据类型,编译器是否关心您选择哪个?

通常不允许编译器将您选择的类型替换为更大的类型,因为这可能会改变程序的含义和行为。 除了uint_fast8_t和类似的现代类型之外,如果编译器会导致更快的代码,则允许编译器交换更大的类型。

作为参考,我正在使用 GCC 和 Clang

编译器无所谓。 只有特定的目标端口及其 ABI 很重要。 虽然在一些低端 CPU 上,如专用微控制器,但通常没有标准化的 ABI,因此每个编译器都为该目标发明了自己的 ABI/调用约定。

正如@WeatherVane 在评论中所说,简单的答案是:

除非有很好的理由不使用int否则请使用int

我不会用一堆痛苦的重复论点来延长这个答案:一切都已经说过很多次了。 如果您使用charshort作为参数类型,通常不会出错,但实际上,也没有任何好处。 你可能会花更多的时间来担心它,而不是用任何其他方式来弥补。

正如安德鲁在评论中提醒我的那样, intunsigned int之间的选择重要; 我并不是要建议忽略这种区别。

暂无
暂无

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

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