В C/C++ переменные могут располагаться в различных сегментах памяти в зависимости от способа их объявления и модификаторов. Рассмотрим основные области хранения переменных.
Характеристики:
Примеры:
void function() {
int localVar = 10; // Локальная переменная на стеке
char buffer[256]; // Массив на стеке
static int localStatic = 5; // Не на стеке! (см. ниже)
}
Особенности:
Характеристики:
Примеры:
int* ptr = new int(42); // Выделение в C++
int* c_ptr = malloc(sizeof(int)); // Выделение в C
*ptr = 100;
delete ptr; // Освобождение в C++
free(c_ptr); // Освобождение в C
Опасности:
Характеристики:
Примеры:
int globalVar = 100; // Глобальная переменная
void func() {
static int counter = 0; // Статическая локальная
counter++;
}
namespace {
int fileStatic = 42; // Статическая в пределах файла
}
Особенности:
.data:
int initialized = 5; // .data
.bss:
int uninitialized; // .bss (будет 0)
Характеристики:
Пример (подсказка компилятору):
register int i; // Устаревшее в C++17, компилятор сам оптимизирует
Характеристики:
Пример:
thread_local int perThreadVar = 0;
void threadFunc() {
perThreadVar++; // У каждого потока своя копия
}
Характеристики:
Пример:
const char* str = "Hello"; // Строковый литерал в .rodata
const int MAX = 100; // Const-переменная
Область | Время жизни | Область видимости | Инициализация | Потокобезопасность |
---|---|---|---|---|
Стек | Автоматическое | Блок/функция | Неопределена | Да (свой стек) |
Куча | До delete/free | По указателю | Неопределена | Нет |
Глобальная | Вся программа | Файл/программа | 0/NULL | Нет |
Статическая | Вся программа | Блок/файл | 0/NULL | C++11+ да |
TLS | Поток | По объявлению | 0/NULL | Да |
Const | Вся программа | По объявлению | Определена | Да |
std::unique_ptr<int> smartPtr(new int(10));
constexpr double PI = 3.1415926535;
Резюмируем: понимание областей хранения переменных критически важно для написания эффективных и безопасных программ на C/C++. Выбор места хранения влияет на производительность, время жизни и видимость переменных, а также на потокобезопасность программы.