Вы вообще найти лучшую документацию на сайте, что все больше людей принимают интерес к обновлению, к примеру - from Wikipedia:
В программировании сегмента данных (часто обозначается .data
) представляет собой часть объектного файла или соответствующего виртуального адресного пространства программы, которая содержит инициализированные статические переменные, то есть глобальные переменные и статические локальные переменные. Размер этого сегмента определяется размером значений в исходном коде программы и не изменяется во время выполнения.
Сегмент данные для чтения и записи, так как значения переменных могут быть изменены во время выполнения.Это в отличие от сегмента данных только для чтения (rodata
сегмент или .rodata
), который содержит статические константы, а не переменные; он также контрастирует с сегментом code
, также известным как сегмент text
, который доступен только для чтения на многих архитектурах. Неинициализированные данные, как переменные, так и константы, вместо этого находятся в сегменте BSS
.
Таким образом, это просто вопрос определения:
В некоторых старых/хоккейных системах они могут быть не только с сегментом чтения только для чтения, но и просто скомбинировать его вместе - основной тонкий g с сегментом только для чтения, это означает, что несколько ошибок сообщаются более резко, вместо того, чтобы позволить программе испортить эти данные и потенциально вырвать фиктивные результаты. Вероятно, поэтому .data
является общим, а когда-то позже - поскольку у авторов OS/компилятора было время и мотивация к уходу - .rodata
оказался контрастирующим с ним, но .data
не был переименован, например. .rwdata
. Эти имена - .data
, .rodata
, test
, BSS
и т. Д. Были и используются в языках ассемблера для обозначения того, где должны располагаться переменные.
Что касается вещей ... глобальные переменные и переменные static
аналогичны тем, что возможно [возможно, виртуальный] адрес памяти для них - и даже их общий размер - могут быть вычислены (по крайней мере, относительно некоторого поддерживающего процессора) сегментный "регистр, который оставлен на удобном значении большую часть времени) во время компиляции. Это контрастирует с автоматическими (стек) и динамическими (кучи) переменными, где переходный период памяти. Большинство систем имеют контроль над доступом для записи в память на основе каждой страницы (например, 4k, 8k), поэтому гораздо менее практично продолжать предоставлять и удалять доступ на запись, чтобы помещать переходные переменные const
в память, что кажется только для чтения для процесса, и это непрактично, когда вы рассматриваете условия гонки в многопоточном приложении. Вот почему это различие между памятью «чтение-запись» и «только для чтения» обычно обсуждается в контексте глобальных и статических переменных.
Неверно, точка статической переменной заключается в том, что ее время жизни равно времени жизни программы. Он может быть изменен в любое время (если не объявлено const). (PS: Вы могли бы легко ответить на свой вопрос, написав код, который изменяет статическую переменную). – Borgleader
Я думал об этом сам, но затем появился следующий вопрос: если я могу изменить содержимое переменной, написав код , не считается ли это временем компиляции, а не временем выполнения? – AutomEng
... Если изменения происходят из-за того, что код работает, это время выполнения. Это только время компиляции, если это происходит * во время компиляции *. – Borgleader