(低级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
寄存器进行显示前存储(如果 2h
和 9h
函数)。
当数据(特别是浮点值)被发送到混合的 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。编译器将尝试使用最有效的存储类型。
这里具体说说C++部分的代码:
(intel x86, .cpp
& .asm
混合程序。)
通过处理 .asm
中的 chars/strings' 指针,我知道它使用 dl
/dx
寄存器进行显示前存储(如果 2h
和 9h
函数)。
当数据(特别是浮点值)被发送到混合的 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。编译器将尝试使用最有效的存储类型。