栈分配
了解自动存储的工作方式
栈分配 是 CoddyKit 上的免费 C++ Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C++ Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C++ Academy 课程共包含 4 节课。
自动存储
局部变量存储在自动存储区中,通常称为栈。它们会在执行进入其 scope 时创建,并在执行离开时销毁。
#include <iostream>
int main() {
int x = 42; // on the stack
double pi = 3.14; // on the stack
std::cout << x << " " << pi << "\n";
}栈会增长和缩小
每次函数调用都会压入一个栈帧,其中保存该函数的局部变量。函数返回时,栈帧会弹出,局部变量也随之消失——不需要手动清理。
#include <iostream>
void greet() {
int local = 7; // pushed on call
std::cout << local << "\n";
} // popped on return
int main() { greet(); }LIFO 顺序
栈遵循后进先出。最近创建的局部变量会在 scope 结束时最先销毁。
#include <iostream>
int main() {
int a = 1;
{
int b = 2; // created after a
std::cout << b << "\n";
} // b destroyed first
std::cout << a << "\n";
}快速且低成本
栈分配非常快:它只需移动栈指针。不需要搜索空闲内存,也不需要像堆那样进行簿记管理。
scope 决定 lifetime
栈对象只在声明它的代码块中有效。嵌套代码块拥有各自的 scope。
#include <iostream>
int main() {
for (int i = 0; i < 3; ++i) {
int square = i * i; // recreated each iteration
std::cout << square << "\n";
}
}大小有限
栈具有固定且有限的大小(通常只有几兆字节)。在栈上分配超大数组可能导致栈溢出崩溃。
// Risky: a large fixed array on the stack
int big[1000000]; // may overflow the stack返回栈地址是错误
绝不要返回指向局部变量的指针或引用。函数返回后,该存储空间已经消失,指针也就悬空了。
int* bad() {
int local = 5;
return &local; // BUG: local dies here
}通过引用传递大型对象
将大型对象复制到栈上会浪费资源。通过 const& 传递对象可以避免复制,同时减少栈的使用量。
#include <string>
void print(const std::string& s) { // no copy
// use s
}栈对象无需 delete
由于编译器会自动管理它们的生命周期,您绝不能对栈变量调用 delete。
#include <iostream>
int main() {
int n = 10;
// delete &n; // ERROR: not heap-allocated
std::cout << n << "\n";
}栈上的数组
长度已知的固定大小数组位于栈上,并会在作用域结束时自动释放。
#include <iostream>
int main() {
int values[3] = {10, 20, 30};
for (int v : values) std::cout << v << "\n";
}何时优先使用栈
对于大小在编译时已知且生命周期较短的小型对象,应优先使用栈。栈速度更快且会自动清理——只有在确实需要时才使用堆。
快速检查
测试您对栈分配的理解。
回顾
您已经了解到,栈分配使用与作用域绑定的自动存储:变量在进入作用域时创建,在退出作用域时按 LIFO 顺序销毁。它速度快、会自动清理,但大小有限。绝不要返回局部变量的地址,也绝不要对栈对象使用 delete。
常见问题解答
「栈分配」课时是免费的吗?
是的 — 「栈分配」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C++ Academy 课程的其余内容,请升级到 CoddyKit PRO。 C++ Academy 课程共包含 4 节课。
「栈分配」这节课中我会学到什么?
了解自动存储的工作方式 你通过在浏览器中直接运行的动手代码来练习 C++ Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 C++ Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 C++ Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「栈分配」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 C++ Academy 课中编写并运行代码吗?
能。每节 C++ Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。