Управление глобальной памятью в C++ в стеке или "куче"?

Импорт в базу данных:

mysql -u username -p database_name < / путь к файлу / имя_файла.sql

Экспорт из базы данных:

mysqldump -u username -p имя_базы_данных> / путь к файлу / имя_файла. sql

После этих команд в командной строке будет запрошен ваш пароль MySQL.

70
задан Igor 27 August 2012 в 20:19
поделиться

8 ответов

Так как я не был удовлетворен ответами и надеюсь, что тот же самый Карджаткар хочет узнать больше, чем простой ответ да / нет, пожалуйста.

Обычно процесс имеет 5 различных областей памяти распределено

  1. Код - текстовый сегмент
  2. Инициализированные данные - сегмент данных
  3. Неинициализированные данные - сегмент bss
  4. Куча
  5. Стек

Если вы действительно хотите узнать, что где где сохранено, прочтите и отметьте их :

КОМПИЛЯТОР, АССЕМБЛЕР, ЛИНКЕР И ЗАГРУЗЧИК: КРАТКАЯ ИСТОРИЯ (см. Таблицу w.5)

Анатомия программы в памяти

alt text

132
ответ дан 24 November 2019 в 13:17
поделиться

Проблема вот в чем вопрос. Предположим, у вас есть крошечная программа на C (тоже ++, они обрабатывают это одинаково) вроде этой:

/* my.c */

char * str = "Your dog has fleas.";  /* 1 */
char * buf0 ;                         /* 2 */

int main(){
    char * str2 = "Don't make fun of my dog." ;  /* 3 */
    static char * str3 = str;         /* 4 */
    char * buf1 ;                     /* 5 */
    buf0 = malloc(BUFSIZ);            /* 6 */
    buf1 = malloc(BUFSIZ);            /* 7 */

    return 0;
}
  1. Она не выделяется ни в стеке, ни в куче. Вместо этого он выделяется как статические данные и помещается в собственный сегмент памяти на большинстве современных машин. Фактическая строка также распределяется как статические данные и помещается в сегмент только для чтения в правильных машинах.
  2. - это просто статический выделенный указатель; место для одного адреса в статических данных.
  3. имеет указатель, выделенный в стеке , и будет эффективно освобожден, когда main вернется. Строка, поскольку она является константой, размещается в статическом пространстве данных вместе с другими строками.
  4. фактически выделяется точно так же, как в 2. Ключевое слово static сообщает вам, что он не должен выделяться в стеке.
  5. ... но buf1 находится в стеке, а
  6. ... malloc ' ed буферное пространство находится в куче.
  7. И, кстати, дети не пробуют это дома. malloc имеет интересующее возвращаемое значение; вы должны всегда проверять возвращаемое значение.

Например:

char * bfr;
if((bfr = malloc(SIZE)) == NULL){
   /* malloc failed OMG */
   exit(-1);
}
27
ответ дан 24 November 2019 в 13:17
поделиться

Обычно ничего не потребляет. Он пытается выделить их в сегменте памяти, который, вероятно, останется постоянного размера для выполнения программы. Это может быть bss, стек, куча или данные.

14
ответ дан 24 November 2019 в 13:17
поделиться

Ни то, ни другое. Это раздел .data.

6
ответ дан 24 November 2019 в 13:17
поделиться

Глобальная память заранее выделяется в фиксированном блоке памяти или в куче, в зависимости от того, как она выделяется вашим приложением:

byte x[10]; // pre-allocated by the compiler in some fixed memory block
byte *y

main()
{
   y = malloc(10); // allocated on the heap
}

РЕДАКТИРОВАТЬ :

Вопрос сбивает с толку: Если я выделяю структуру данных глобально в приложении C ++, потребляет ли она память стека или память кучи?

«выделить»? Это может означать многое, включая вызов malloc (). Было бы иначе, если бы вопрос был «объявляю ли я и инициализирую структуру данных глобально».

Много лет назад, когда процессоры все еще использовали сегменты по 64 КБ, некоторые компиляторы были достаточно умны, чтобы динамически выделять память из кучи вместо резервирования блока в сегменте .data (из-за ограничений в архитектуре памяти).

Думаю, я слишком стар ....

5
ответ дан 24 November 2019 в 13:17
поделиться

Сам глобальный объект будет занимать память, которую среда выполнения или компилятор резервирует для него перед выполнением main, это не переменные затраты времени выполнения, поэтому ни стек, ни куча.

Если ctor объекта выделяет память, она будет в куче, и любые последующие выделения объектом будут выделения в куче.

Это зависит от точной природы глобального объекта, если это указатель или сам объект целиком, который является глобальным .

0
ответ дан 24 November 2019 в 13:17
поделиться

глобальные переменные находятся в куче. это особый случай, потому что они живут жизнью программы

-1
ответ дан 24 November 2019 в 13:17
поделиться

Если вы явно выделяете память с помощью команд new или malloc, она будет размещена в куче. Если компилятор выделяет память, она будет размещена в стеке.

-3
ответ дан 24 November 2019 в 13:17
поделиться
Другие вопросы по тегам:

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