前置篇:01|内存:值放堆上还是放栈上,这是一个问题
回头重新思考,编程中那些耳熟能详却又似懂非懂的基础概念,搞清楚底层逻辑。
栈
栈上存放的数据是静态的,固定大小,固定生命周期;堆上存放的数据是动态的,不固定大小,不固定生命周期。
思考题
- 如果有一个数据结构需要在多个线程中访问,可以把它放在栈上吗?为什么?
在多线程场景下,每个线程的生命周期是不固定的,我们不确定线程A在访问线程B的调用栈上的内存时,线程B是否已经结束。
这时候,只能使用堆内存。如果线程结束的顺序是确定的,就可以是使用栈内存。比如scoped thread.
- 可以使用指针引用栈上的某个变量吗?如果可以,在什么情况下可以这么做?
而同一个调用栈下,A() 调用 B(),再调用 C(),编译器很清楚,C() 会先结束,之后是 B(),最后是 A()。所以在 C() 下用指针引用 B() 或者 A() 内部的变量没有问题,这个指针必然先于它指向的值结束。这个两个问题的实质是我们要搞明白哪些东西在编译期可以确定它们的关系或者因果,哪些只能在运行期确定。
网友评论