2016-01-26 6 views
1

Прежде чем вы начнете отмечать этот вопрос как дубликат, я уже this, но он не отвечает на мой вопрос.Когда память распределяется на предопределенные объекты потока?

поток объектов как std::cout, std::cin глобальные экземпляры ostream & istream классов. Но мой вопрос в том, когда память распределяется по этим объектам? Когда эти объекты инициализируются? Является ли память распределенной во время компиляции или времени выполнения или время выполнения C++ инициализирует эти объекты во время выполнения перед вызовом main()? Где std::cout & std::cin Объект находится в стеке, куче или сегменте данных?

+0

Любопытно, почему вас это волнует? – Borgleader

+0

@ Бордерлидер просто чисто любопытство, может быть? –

+0

С помощью [magic] (http://www.petebecker.com/js/js199905.html). –

ответ

3

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

Они инициализируются некоторой неопределенной магией (возможно, конкретными трюками реализации) как можно раньше, но не позднее, чем перед первым утверждением main.

+0

Итак, нет точного ответа. Это зависит от того, как библиотека выполнения используется в компиляторе. правильно? – Destructor

+0

Это зависит от того, какую поддержку предлагает компилятор. Иногда может быть ['#pragma init_seg'] (https://msdn.microsoft.com/en-us/library/7977wcck.aspx) или аналогичный, чтобы придать библиотечному коду более высокий приоритет, чем обычный код пользователя. –

0

Эти объекты гарантированно будут инициализированы во время или до того момента, когда объект типа std :: ios_base :: Init будет создан и доступен для использования в конструкторах и деструкторах статических объектов.

Это реализация LLVM: https://github.com/llvm-mirror/libcxx/blob/master/src/iostream.cpp

1

, когда память выделяется на эти объекты?

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

Когда эти объекты инициализируются?

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

Где std :: cout & std :: cin объект находится в стеке, куче или сегменте данных?

Они находятся в статической памяти. Строго говоря, нет стек или куча в C++, только статическая, динамическая и автоматическая память. Точное место будет зависеть от реализации библиотеки.

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

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