第一个问题在这里。我将在几周/几个月内需要创建程序代码,其中将有函数将大(我的意思是非常大)的数据集直接分配给指针。这是我将要做的一些代码示例:
void MyFuntion(string* str)
{
*str = "some data in a string";
}
Run Code Online (Sandbox Code Playgroud)
这确实很重要:我在 windows 10 上,在 Visual-studio 2019 中,使用 x86 版本上的默认 C++ 编译器进行编译。
想象一下类似的情况,但字符串可以包含数百万个字符,或者 int/float 数组也包含数百万个元素。因此,这是将右值分配给指针的单个操作,因此该指针位于堆上。当然,如果我创建一个包含数据的局部变量,它将超过 1MB,因此会导致堆栈溢出,对吗?
据我了解,由于数据在这里仅作为右值存在,因此它没有内存存在,但我想知道:右值如何分配给指针?比如,它是如何在装配中完成的?我必须说我从来没有做过任何组装,我有一些(很少)想法,但我想在有时间的时候参与其中。
它是在放入最终内存地址之前在堆栈或堆中临时创建的吗?我的猜测是,内存地址(我在其中分配数据的指针)直接填充了数据,就像一点一点一样,所以内存中不存在右值。
如果我是正确的,这里堆栈中存在的唯一内容是:函数调用,指针复制,然后是指令,应该类似于“将右值 X 分配给左值 Y”,并且指令的大小不取决于右值和左值的大小,因此这里的堆栈不应该有任何问题。
因此,如果我是正确的,那么无论右值有多大,这段代码都不会引起任何问题,但我仍然想知道它是如何在汇编方面准确完成的。请注意,我不仅仅是在寻找答案,而且更像是一些可以详细解释的参考文献、书籍或文档。我想我正在寻找的内容不会出现在一本 C++ 书中,而更像是一本汇编书,这可能是让自己进入其中的一个很好的起点!