(低级C++)在一条数据上使用"cout"时,它是不是在显示到屏幕之前?

(Lower level of C++) When using "cout" on a piece of data, were does it go to before being displayed on screen?

这里具体说说C++部分的代码:

(intel x86, .cpp & .asm 混合程序。)

通过处理 .asm 中的 chars/strings' 指针,我知道它使用 dl/dx 寄存器进行显示前存储(如果 2h9h 函数)。

当数据(特别是浮点值)被发送到混合的 C++ 部分,然后用 cout 处理时情况如何?

cout 将其转换为要显示的字符串之前,该值存储在哪里? (是寄存器,还是栈,还是别的?)

C++ 的底层内容是平台相关的。例如,从键盘读取一个字符。有些平台没有键盘。一些平台在字符到达时发送消息,其他平台则等待(轮询输入端口)。

让我们从高级语言往下谈一谈。

对于cin,底层从输入缓冲区读取字符。如果缓冲区为空,则底层从标准输入中读取字符并将它们存储到缓冲区中,直到检测到行尾字符。

注:有绕过这一层的方法,还是用C++

在许多基于 OS 的平台中,C++ 库最终会调用 OS 函数来获取单个字符。在 Linux 中,OS 将此请求委托给 驱动程序 。驱动程序负责从硬件读取字符并将其返回。驱动程序是从键盘获取字符的一段代码。

此路径有例外,例如 piping。使用管道,OS 将请求从标准输入重定向到文件或设备,具体取决于命令行。

Where is that value stored before the cout converts it into a string to be displayed? (Is it a register, or a stack, or something else?)

编译器调用一个函数,将浮点变量的内部表示转换为文本表示。此文本表示逐个字符地发送到基础 cout 函数;或者作为指向字符串的指针。文本表示几乎可以驻留在任何地方:堆栈、堆、缓存等。它真的没有什么区别。大多数处理器寄存器都太小,无法包含浮点数文本表示中的所有字符。

在传递给转换函数之前,浮点值可能存储在寄存器中、堆栈中或其他地方。取决于编译器的优化级别和转换函数的 API。编译器将尝试使用最有效的存储类型。