GLib类型的位大小和可移植性更加奇特(想想16位字符)平台

时间:2014-06-28 11:11:06

标签: c++ c portability glib

例如,给定https://developer.gnome.org/glib/stable/glib-Basic-Types.html的定义:

  

gint8

     

typedef signed char gint8;

     

所有平台上的有符号整数保证为8位。价值观   此类型的范围可以从G_MININT8(= -128)到G_MAXINT8(= 127)

- GLIb做了什么来保证在char不是8位的平台上仍然是8位的类型?或者只是GLib x86 /等(即这是一个已知的限制)?

2 个答案:

答案 0 :(得分:2)

gint8(以及其他平台相关类型)在glibconfig.h中声明,通常安装在/usr/lib/glib-2.0/include下。

该文件是在configure time生成的,因此,至少在理论上,gint8可能会有所不同。

答案 1 :(得分:2)

正如Hans Passant在评论中所说,glib通过不支持gint8为任何其他大小的平台来保证signed char为8位。只有两种类型的系统曾经有过C编译器实现,而这些要求并未得到满足。

第一种是字节大小为9位的系统。今天这些已经过时了,但像这样的系统有一些最早的C编译器。理论上,编译器可以模拟一个受限范围的8位类型作为扩展,但它在内存中仍然是9位长,并没有真正得到任何东西。

第二个是字可寻址系统,字大小是16位,32位还是64位。在这些计算机中,处理器只能在字边界处寻址存储器。地址0是第一个字,地址1是第二个字,依此类推,字之间没有任何重叠。在大多数情况下,像这样的系统现在已经过时,但不能像9位字节机那样多。在嵌入式系统中,显然至少仍有一些字可寻址处理器的使用。

在针对字可寻址系统的C编译器中,字节大小可以是字大小,也可以是8位,具体取决于编译器。一些编译器做出了选择。拥有字大小字节是一种简单的方法。另一方面,实现8位字节需要相当多的工作。编译器不仅必须使用多个指令来访问每个字中包含的单独的8位值,还必须模拟字节可寻址指针。这通常意味着char指针的大小与int指针的大小不同,因为字节可寻址指针需要更多空间来存储地址和字节偏移量。

毋庸置疑,glib支持使用字大小字节的编译器,而使用8位字节的编译器至少能够实现gint8。虽然由于其他一些原因,它们仍然可能无法得到支持。 sizeof(char *) > size(int *)为真的事实可能是一个问题。

我还应该指出,还有一些其他过时的过时系统,虽然C编译器使用的是8位字节,但仍然没有满足gint8要求的类型。这些系统使用的是'补码或带符号的整数,意味着signed char范围从-127到127而不是由glib保证的-128到127范围。