Діаграма показує типову структуру пам'яті типової комп'ютерної програми із секціями відведеними під текст, різноманітні дані, стек і купу.

У програмуванні, термін .bss або bss використовується в багатьох компіляторах і лінкерах (англ. linkers) як назва для розділу об'єктного файлу або виконуваного файлу, що містить статичні змінні які не були явно ініціалізовані до певного значення. Ця область часто називається "bss секцією" або "bss сегментом".

Як правило в об'єктному файлі зберігається лише довжина bss секції, і не зберігається жодних даних. Завантажувач програми[en] виділяє пам'ять для bss секції під час завантаження програми. На деяких платформах, частина або вся bss секція ініціалізується нулями. UNIX-подібні операційні системи і Windows ініціалізує bss секцію нулями, таким чином всі статично алоковані змінні в C і C++, які ініціалізуються такими значеннями, що всі їх біти будуть заповнені нулями, будуть розміщені у bss сегменті. Операційні системи можуть використовувати техніку, яка називається заповненням нулями за потребою (англ. zero-fill-on-demand) аби ефективно реалізувати bss сегмент.[1] У вбудованому програмному забезпеченні, bss сегмент вказує на пам'ять, яка буде ініціалізована нулями середовищем виконання[en] C перед тим як буде виконано вхід у main(). Деякі середовища виконання C можуть дозволяти, щоб частина bss сегменту не була ініціалізована; змінні C повинні розміщуватися у даній частині bss сегменту явним чином.[2]

BSS в C

В C, статично-алоковані об'єкти без явного ініціалізатора значення будуть ініціалізовані нулями (для арифметичних типів) або нульовим вказівником (для вказівних типів). В реалізації C, як правило, нульові значення і вказівники у бітовому представленні складаються лише із бітів з нульовими значеннями (хоча це не вимагається стандартом C). Таким чином, сегмент BSS як правило містить всі неініціалізовані об'єкти (змінні і константи), що оголошені в області видимості файлу (тобто, за межами будь-якої функції) а також не ініціалізовані локальні статичні змінні (локальні змінні оголошені із ключовим словом static ); статичні локальні константи повинні ініціалізуватися в оголошенні, оскільки вони не мають окремого оголошення, вони як правило не розміщуються у BSS секції, хоча вони можуть явним чи неявним чином ініціалізувати в нульове значення.

Пітер ван дер Лінден[en], автор мови C і програміст, говорить, "Деякі люди люблять запам'ятовувати цей сегмент, як 'Краще залишити місце'" ("Some people like to remember it as 'Better Save Space'). Оскільки BSS сегмент містить змінні, які ще не мають будь-якого значення, не потрібно зберігати представлення цих змінних. В об'єктний файл записується розмір BSS сегмента, але BSS (на відміну від сегмента даних) не займає ніякого фактичного місця в об'єктному файлі."[3]

Примітки

  1. McKusick, Marshall Kirk; Karels, Michael J. (1986). A New Virtual Memory Implementation for Berkeley UNIX. University of California, Berkeley. с. 3. Архів оригіналу за 11 грудня 2018. Процитовано 14 жовтня 2019.  Проігноровано невідомий параметр |citeseerx= (довідка)
  2. Memory Sections. AVR Libc Home page. Архів оригіналу за 19 жовтня 2019. Процитовано 14 жовтня 2019. 
  3. Peter van der Linden, Expert C Programming: Deep C Secrets [Архівовано 27 січня 2022 у Wayback Machine.], Prentice Hall 1994, p. 141

Посилання