Другие языки программирования и технологии

C++ _msize() как узнаёт длину массива?

Всем привет!
Как функция _msize() узнаёт объём памяти, выделенный под динамический массив, откуда берётся эта информация?
https://pastebin.com/wVCEW1p8
Спасибо за ответы!
Размер массива тоже хранится в памяти. Если для простоты примера взять подход к выделению памяти, предложенный Д. Кнутом, то слева от участка, на который указывает указатель, хранится так называемый граничный маркер - размер выделенного блока и флаг "занят/свободен". Этот самый размер система и возвращает. Такой же маркер хранится после выделенного блока.
Если даже взять какой-нибудь более сложный аллокатор, например, SLAB, то по самому указателю можно вычислить адрес slab'a и вернуть размер блока.
Roman Stroganov
Roman Stroganov
20 861
Лучший ответ
Азамат Бекмагамбетов Какой аллокатор используется?
ЫЫЫЫ, указатели, экономия памяти, ЫЫЫ! Это же железо сгорит, если создать двумерный массив!
Через попу создали язык... Создали какие-то массивы, которые никто не юзает, ибо настолько сильно жадничать памятью - дебилизм. Не люблю я синтаксис этот, не люблю... Все языки - как языки, а этот - чучело лохматое. Да, есть и в других языках минусы, но... Но хорошо, что не Паскаль.
Как говорится: <<У С++ есть лишь 2 плюса>>
Дима Бурлак
Дима Бурлак
3 143
Андрей Барахтин Массив - это одна из базовых структур данных в программировании. В большинстве языков программирования есть массивы.

> Все языки - как языки
Какие языки ты знаешь?
Используйте std::vector или таскайте в отдельной переменной размер массива.
Игорь Букань
Игорь Букань
2 696
Азамат Бекмагамбетов Я всегда и везде использую vector < T >, а спрашиваю из интереса. Очень интересно откуда информация берётся, где это лежит?
#include
#include
#include
#include

using namespace std;

void Gen(int *);

void Show(int *);

int main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
srand(time(NULL));
system("color 0A");

cout << "Введите длину массива ";
unsigned n;
cin >> n;
auto arr = new int[n];
Gen(arr);
Show(arr);

system("pause");
return 0;
}

void Gen(int *arr)
{
auto len = _msize(arr) / sizeof(arr[0]);
generate(arr, arr + len, []() { return rand() % 49 + 1; });
}

void Show(int *arr)
{
auto len = _msize(arr) / sizeof(arr[0]);
cout << "Длина массива замерена и равна "
<< len << endl;
for (auto t = 0u; t < len; ++t)
{
cout << arr[t] << " ";
}
cout << endl;
}
интересный вопрос

оставлю коммент чтобы посмотреть ответы

Похожие вопросы