是的,存在不直接支持的数据类型.
在许多嵌入式系统上,没有硬件浮点单元.所以,当你写这样的代码时:
float x = 1.0f, y = 2.0f;
return x + y;
它被翻译成这样的东西:
unsigned x = 0x3f800000, y = 0x40000000;
return _float_add(x, y);
然后,编译器或标准库必须提供_float_add()
的实现,这会占用嵌入式系统上的内存.如果你在一个非常小的系统上计算字节数,这可能会累加起来.
另一个常见的例子是64位整数(自1999年以来在C标准中为long long
),32位系统不直接支持这些整数.旧的SPARC系统不支持整数乘法,因此乘法必须由运行时提供.还有其他例子.
其他语言
相比之下,其他语言有更复杂的原语.
例如,Lisp符号需要大量的运行时支持,就像Lua中的表、Python中的字符串、Fortran中的数组等等.C中的等效类型通常要么根本不属于标准库(没有标准符号或表),要么更简单,不需要太多运行时支持(C中的数组基本上只是指针,以nul结尾的字符串几乎同样简单).
控制 struct
C中缺少的一个值得注意的控制 struct 是异常处理.非本地退出限制为setjmp()
和longjmp()
,这两个选项只保存和恢复处理器状态的某些部分.相比之下,C++运行时必须执行堆栈并调用析构函数和异常处理程序.