Где аллоцируются элементы std::array?
#новичкам
Вроде бы простой вопрос с собеседования, но он имеет 2 уровня погружения. В зависимости от того, как вы ответите, интервьюер будет по-разному воспринимать глубину ваших знаний.
1 уровень
Элементы std::array аллоцируются на стеке. std::array - это очень тонкая обертка над сишными массивами, в которых элементы располагаются именно на стеке.
Это очень легко проверить, достаточно сравнить размеры двух арреев с разным количеством элементов:
std::array<int, 10> arr{0};
std::array<int, 20> arr1{0};
std::cout << sizeof(arr) << " " << sizeof(arr1) << std::endl;
// OUTPUT:
// 40 80
Два массива на 10 и на 20 элементов, каждый элемент занимает по 4 байта. И все сходится: размер
arr 10*4 байт, а второго - 20*4.
2 уровень
Вообще говоря,
std::array - это обычный объект. Объекты можно размещать на стеке, а можно и на ......... правильно, куче.
Делается это очень просто:
void* operator new(std::size_t size) {
void* ptr = std::malloc(size);
if (!ptr) throw std::bad_alloc{};
std::cout << "Allocation has happend" << std::endl;
return ptr;
}
int main() {
auto * ptr = new std::array{0, 1, 2, 3, 4};
delete ptr;
}
// OUTPUT:
// Allocation has happend
Один new и на стеке уже лежит лишь указатель, а сами элементы массива хранятся на куче.
Прям вот в таком виде вряд ли кто-то работать с std::array.
Но если std::array является полем какого-то класса, объекты которого аллоцируются на куче, то и элементы массива тоже будут на куче располагаться.
Поэтому ответ на вопрос из заголовка поста - где хотим, там и располагаем. А если чуть менее пафосно, но более точно - там, где аллоцирутся сам объект std::array.
Reach advanced levels. Stay cool.
#cppcore #cpp11 #memory #interview
Обсуждение 19
Обсуждение не доступно в веб-версии. Чтобы написать комментарий, перейдите в приложение Telegram.
Обсудить в Telegram