C++栈与堆内存对比
C++栈与堆内存对比
C++内存分为栈和堆两种主要区域。栈自动管理、快速分配;堆灵活但需要手动管理。理解两者的区别对编写高效代码至关重要。
栈内存自动管理,分配速度极快。
#include
#include
class Widget {
int data_[1024];
public:
Widget() { /* initialize */ }
};
void stack_allocation() {
Widget w;
int local = 42;
std::cout << "Stack variable: " << local << "\n";
}
void heap_allocation_new() {
Widget* w = new Widget();
delete w;
}
void allocation_speed_comparison() {
const int iterations = 100000;
auto start = std::chrono::high_resolution_clock::now();
for (int i = 0; i < iterations; ++i) {
Widget w;
}
auto end = std::chrono::high_resolution_clock::now();
auto stack_time = std::chrono::duration_cast(end - start);
start = std::chrono::high_resolution_clock::now();
for (int i = 0; i < iterations; ++i) {
Widget* w = new Widget();
delete w;
}
end = std::chrono::high_resolution_clock::now();
auto heap_time = std::chrono::duration_cast(end - start);
std::cout << "Stack: " << stack_time.count() << " us\n";
std::cout << "Heap: " << heap_time.count() << " us\n";
std::cout << "Heap/Stack ratio: " << (double)heap_time.count() / stack_time.count() << "x\n";
}
栈大小有限制。
void stack_size_limit() {
std::cout << "Default stack size: ~1-8 MB (platform dependent)\n";
std::cout << "Deep recursion can cause stack overflow\n";
std::cout << "Large local arrays should use heap\n";
// This would cause stack overflow:
// char large_buffer[10 * 1024 * 1024];
}
堆的灵活性允许动态大小。
void heap_flexibility() {
size_t size;
std::cout << "Enter array size: ";
std::cin >> size;
int* dynamic_array = new int[size];
for (size_t i = 0; i < size; ++i) {
dynamic_array[i] = i;
}
std::cout << "Dynamic array[" << size - 1 << "]: " << dynamic_array[size - 1] << "\n";
delete[] dynamic_array;
}
内存碎片影响堆性能。
void fragmentation_notes() {
std::cout << "Heap fragmentation causes:\n";
std::cout << " - Memory waste\n";
std::cout << " - Allocation slowdown\n";
std::cout << " - Out-of-memory even when enough free memory exists\n\n";
std::cout << "Mitigation strategies:\n";
std::cout << " - Object pools\n";
std::cout << " - Stack allocation preference\n";
std::cout << " - Smart pointers with RAII\n";
}
智能指针委托内存管理。
void smart_pointers_memory() {
auto ptr = std::make_unique(1000);
auto shared = std::make_shared();
for (int i = 0; i < 1000; ++i) {
ptr[i] = i * i;
}
std::cout << "Smart pointer managed memory\n";
}
对象生命周期对比。
void lifecycle_comparison() {
std::cout << "Stack: objects destroyed when scope exits\n";
std::cout << "Heap: objects persist until explicitly deleted\n";
std::cout << "Smart pointers: destroyed when no more references\n";
{
Widget stack_widget;
std::cout << " Stack widget alive\n";
}
std::cout << " Stack widget destroyed\n";
auto heap_widget = std::make_shared();
std::cout << " Heap widget alive\n";
}
在类成员中正确选择内存区域。
class GameEngine {
std::vector> entities_;
Renderer renderer_;
std::string config_;
public:
GameEngine() : renderer_(), config_("default.cfg") {
entities_.push_back(std::make_unique());
}
};
struct Entity {
int id;
float x, y, z;
std::string name;
};
正确选择内存区域对程序性能和稳定性有重大影响