我通常理解函数如何按值返回对象.但我想在较低的层面上理解它.装配水平如果合理.
我理解这段代码
ClassA fun(){
ClassA a;
a.set(...);
return a;
}
Run Code Online (Sandbox Code Playgroud)
在内部转化为
void fun(Class& ret){
ClassA a;
a.set(...);
ret.ClassA::ClassA(a);
}
Run Code Online (Sandbox Code Playgroud)
这有效地在返回值上调用复制构造函数.
我也明白,有一些优化(如NRVO)可以生成以下代码,避免复制构造函数.
void fun(Class& ret){
ret.set(...);
}
Run Code Online (Sandbox Code Playgroud)
不过我的问题有点基础.它与具体的对象无关.它甚至可以是原始类型.
让我们说我们有这个代码:
int fun(){
return 0;
}
int main(){
fun();
}
Run Code Online (Sandbox Code Playgroud)
我的问题是存储在内存中的返回对象在哪里.
如果我们看一下堆栈......有堆栈框架main然后是堆栈框架fun.返回对象是否存储在某个地址中,可能在两个堆栈帧之间?或者它可能存储在main堆栈帧中的某个地方(可能是生成的代码中通过引用传递的地址).
我已经考虑过了,第二个似乎更实用但是我不明白编译器如何知道在堆栈帧中推送多少内存main?它是否计算出最大的返回类型是什么,即使存在浪费的内存也会推动它?或者它是动态完成的,它仅在调用函数之前分配该空间?
我最近在大学里一直在学习 OpenGL,并自己搜索了像 Qt 这样的 C++ 中的 Windows GUI 编程。我什至更深入地发现了适用于 Windows GUI 的 XLib。但我仍然没有得到大局。
我知道 Qt 是建立在 XLib 之上的。为了做 OpenGL,我需要通过一些库(如 GLUT)来定义上下文。据我了解,GLUT 基本上是一个通过 GLX 连接 XLib 和 OpenGL 的库。
我还了解到 OpenGL 在 GPU 上运行,并且 XLib 嵌入到操作系统中。那么当操作系统安装在没有 GPU 的计算机上时会发生什么。据我所知它会起作用。这是否意味着 XLib 不依赖 OpenGL 来绘制 Windows 等?如果是这样,它依赖什么?或者它可能通过某个驱动程序逐个像素地绘制它。
简而言之,LibX 是如何实现其 GUI 元素的,是通过 openGL 还是其他方式?
注 1:我用“Windows GUI”指的是按钮、文本框和窗口生成等。注 2:我在 Linux 上运行。