例如,在C中,没有没有运行时库(libc)的malloc()。我想例如,在Windows上,malloc只调用HeapAlloc()。但是在C ++中,分配动态内存的方式实际上是语言的关键词;同样的“删除”。因此,如果在没有运行时库的情况下编译代码,“new”将如何工作?
由于
答案 0 :(得分:2)
如果new运算符没有重载,则它通常与malloc函数相同。 依赖于平台。唯一的区别是,它会自动管理数据的初始化。
编辑:
在Linux上,没有标准库就无法编译。您收到以下消息:
phong@colinux ~ $ g++ -nostdlib test.cpp
/usr/bin/ld: warning: cannot find entry symbol _start; defaulting to 00000000080480d8
/tmp/ccOV36hW.o: In function `main':
test.cpp:(.text+0x11): undefined reference to `operator new(unsigned int)'
test.cpp:(.text+0x21): undefined reference to `operator delete(void*)'
/tmp/ccOV36hW.o:(.eh_frame+0x12): undefined reference to `__gxx_personality_v0'
collect2: ld returned 1 exit status
答案 1 :(得分:0)
像任何未找到的函数指针一样。
答案 2 :(得分:-1)
动态内存分配(也是printf()
)需要操作系统支持。您无法编写这些功能的硬件(或OS)独立版本。
没有任何操作系统支持的程序(正如您对C的期望)将无法与外部交互,因此它无用。
这意味着这个纯粹的理论问题毫无意义。
@In silico:这是一个很难的...在控制器上,你必须知道你运行的特定硬件的一些细节,以便你知道*(char*)(0x123)^=1
将切换一个led。这不是C标准中定义的内容,而是您对外部的了解。操作系统只不过是关于硬件的知识集合。
当然,你可以在没有CRT的情况下运行(就像一些病毒那样),通过在内存中查找内核地址并查找导出的函数。但同样,它只是重现CRT的功能,这对任何程序都至关重要。
@Fred Nurk:我想说的是“纯C”没有定义与硬件交互的任何标准手段,它是由OS完成的。所以没有必要运行这样的程序。例如,您无法编写将在每个系统上运行的“通用”malloc
。
@Phong:是的,这意味着你刚刚为它编写了CRT(或操作系统)。并且它不像“纯C”本身那样便携。
注意: 操作系统支持我还指的是有关特定硬件的知识
纯C 我指的是仅使用标准C结构的可移植代码。