2016-04-03 5 views
0

В настоящее время я работаю с библиотекой, которая потенциально создает объекты с тяжелым весом. В частности, я создаю объекты, связанные с волновыми файлами.Как определить, был ли объект создан в основном из стека или динамической памяти

Теперь, создавая экземпляр объекта Wave (как пример), есть ли хороший способ определить, где он выделяется в памяти?

Например, если я должен был создать экземпляр std :: vector в стеке, я знаю, что в стеке выделена некоторая память (т. Е. Информация заголовка), и фактические данные контейнера создаются в куче. Поэтому, по большей части, мне не нужно беспокоиться о переполнении памяти стека. Хотя у меня все еще есть возможность полностью создать объект в куче.

Но скажем, я не знаю об объектах реализации. Допустим, я использую библиотеку, которая создает массив массива в стеке. Это может вызвать проблемы.

Итак, мой вопрос: как мы знаем, как «тяжелый» объект является памятью мудрым?

+0

Короткий ответ: вы не можете. По крайней мере, если вы не используете фабричную часть, которая всегда создает объекты в куче. В этом случае ответ всегда «куча», конечно. –

ответ

3

Я собираюсь предположить, что внестандартные методы выделения памяти стека находятся вне таблицы (alloca и друзья).

Учитывая, что это просто: возьмите объект sizeof.

C++ - статически типизированный язык, но его объекты также статически размер. Каждый тип имеет размер, который должен быть определен во время компиляции. Многие C++ полагаются на это. Поэтому, если вы обеспокоены тем, что какой-то объект занимает слишком много места в стеке, это может быть только потому, что объект sizeof занял это пространство.

Обратите внимание, что это не предотвратит проблемы, когда вы вызываете функцию, которая сама использует много пространства для стека. Вы ничего не можете сделать, чтобы обнаружить это. Но вы можете определить, будет ли размер данного объекта «большим» или нет, путем какого-либо произвольного измерения.

+0

Я вижу. По какой-то причине я думал, что у вас может быть объект с элементом std :: array, размер которого может меняться в зависимости от вызова конструктора объектов ... Но размер массива должен быть фиксированным и не может меняться. – Izzo

 Смежные вопросы

  • Нет связанных вопросов^_^