鉴于这种代码:C + +我正确的存储每个变量的位置?
void myFunction (int * a) {
*a = 10;
}
int main() {
int *b = new int;
*b = 20;
myFunction(b);
}
我说得对不对认为两者一个和文字值存储在堆栈(与一个拿着文字值10的内存地址)?
而且也,是正确地说,b存储在堆栈而值存储在堆中?
谢谢!
鉴于这种代码:C + +我正确的存储每个变量的位置?
void myFunction (int * a) {
*a = 10;
}
int main() {
int *b = new int;
*b = 20;
myFunction(b);
}
我说得对不对认为两者一个和文字值存储在堆栈(与一个拿着文字值10的内存地址)?
而且也,是正确地说,b存储在堆栈而值存储在堆中?
谢谢!
不完全。 myFunction()
收到一个指向堆分配的指针int
。因此,虽然a
存储在堆栈中,但数字10存储在堆中。
因为a
和b
都是相同的指针,所以同一个指针显然会一次指向一个地方。
某些其他调用者肯定可以调用myFunction()
,将指针传递给某些int
变量,该变量在本地范围内声明,因此存储在堆栈中。在这种情况下,myFunction()
的参数以及它指向的内容将最终驻留在堆栈上。但在这种情况下,指针指向在动态范围中实例化的int
,因此存储在堆中。
从技术上讲,C++没有“堆栈”的概念。相反,适当的术语将是“存储持续时间”。
对象自动存储时间段通常被认为是“存储在堆栈中”,但这并不意味着有关实际线程堆栈的任何内容。
而是自动存储时间保证你的对象的生命周期势必范围只在定义
你的情况,你有两个对象具有自动存储时间:int *b
,在main()
的范围界定,和int* a
的myFunction
。这两个都是int的指针;
你有第三个目的是与new int
语句创建一个int
;它具有动态存储持续时间,即存储在堆上。 a
和b
都用于修改其值。
最后的文字不存储在所有。一个文字是一个固定值,所以它会被硬编码到你的二进制文件中。再一次,这并不意味着实际值被“存储”在二进制文件中,而是编译器只是说明了使用该值的效果,例如,
a = 0;
可被编译为
xor rax,rax
其没有明确提到0
文字值不存储在堆栈中,它们被复制那里当变量被初始化。 – Havenard