I am reading K&R's “The C Programming Language” and came across this statement [Introduction, p. 3]:

Because the data types and control structures provided by C are supported directly by most computers,实现自包含程序所需的运行时库很小.

粗体的声明是什么意思?有没有计算机直接支持的数据类型或控制 struct 的例子?

推荐答案

是的,存在不直接支持的数据类型.

在许多嵌入式系统上,没有硬件浮点单元.所以,当你写这样的代码时:

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++运行时必须执行堆栈并调用析构函数和异常处理程序.

C++相关问答推荐

使用sd-设备列举设备导致seg错误

数组元素的编号索引

海湾合作委员会是否保证大小匹配的访问?

问关于C中的指针和数组

C中的ATONE会扰乱SEN/CLUTE GMS应用程序中的其他字符串

Tiva TM4C123GXL的I2C通信

如何在C中从函数返回指向数组的指针?

这是一个合法的C Strdup函数吗?

C中的指针增量和减量(*--*++p)

轮询libusb_pollfd struct 列表的正确方式是什么?

CGO:如何防止在使用CGO在包中包含C头文件时出现多个定义...&q;错误?

OpenSSL:如何将吊销列表与SSL_CTX_LOAD_VERIFY_LOCATIONS一起使用?

使用TCL C API导航到列表中的元素

从C文件中删除注释

C代码可以在在线编译器上运行,但不能在Leetcode上运行

循环中的静态变量与块中的变量和循环

Valgrind用net_pton()抱怨

Valgrind正在使用一个Fexecve电话报告不可能发生的事情

在文件描述符上设置FD_CLOEXEC与将其传递给POSIX_SPOWN_FILE_ACTIONS_ADCLOSE有区别吗?

如何找出C中分配在堆上的数组的大小?