2010-02-19 17 views
6

Mam pytanie wyjaśniające moje wątpliwości dotyczące organizacji pamięci w komputerze w C++.Sekcja danych w C++

W C++ różne dane są umieszczane w różnych miejscach. Moje zrozumienie jest takie.

1) sekcja segmentu danych, w której znajdują się dane globalne i statyczne;

2) sekcji hałdy, przedmiotów wytworzonych nowym

3) części stosu, w zmiennej lokalnej

4) części tekstu, na samym kodzie.

Czy to prawda? Czy jest coś, co przeoczyłem lub zrobiłem źle?

Dzięki!

+0

Właściwie to zależy od formatu obiektu. Dla uproszczenia, na przykład w Mach-O, wszystkie ** stałe ** dane będą przechowywane w segmencie "__TEXT". A potem jest jeszcze segment "__LINKEDIT", który pomaga 'dyld'owi na dynamiczne łączenie, itp. – kennytm

+1

Głównym problemem z twoim pytaniem jest założenie, że istnieje tu jakiś standard, podczas gdy są tylko zwyczajne praktyki. Choć wspomniana organizacja jest powszechna i uzasadniona, nie jest uniwersalna i może się różnić w zależności od implementacji. –

+0

Innym problemem jest to, że standard językowy (specyfikacja) nie wymaga sekcji danych ani segmentów. Język określa atrybuty (odczyt lub zapis, publiczny, prywatny) i czas życia obiektu. Sekcje danych zależą od kompilatora lub tłumacza i mogą różnić się w zależności od producenta i wersji. –

Odpowiedz

4

Here is a guide, które mogą pomóc.

+0

To jest bardzo stare pytanie, a David nie zalogował się od roku, ale odpowiedź typu "tylko link" z martwym linkiem nie jest zbyt duża. użyteczne dla tej strony –

+0

@en_Knight Zastąpiony link linkiem z Internet Archive; ten sam dokument. Byłem zalogowany na tej stronie w ciągu ostatniego roku, ale moja aktywność sieciowa SE jest teraz skoncentrowana na UX i Freelancing, ponieważ zmieniłem karierę. – David

+0

wow ... to świetnie ... dziękuję! –

1

Zazwyczaj istnieją co najmniej dwie sekcje danych. Jeden z zainicjowanymi globaliami, inny bez (BSS). Sekcja stosu zwykle nie jest emitowana w pliku binarnym.

Oczywiście tego rodzaju pytania dotyczące konkretnych zastosowań są bezużyteczne, jeśli nie określi się implementacji.

+0

Tak, bardzo konkretna implementacja, ale ponad 15 lat nigdy nie pracowałem z łącznikiem, który nie generuje co najmniej .text, .data i .bss. Napotkano również kilka razy zbyt wiele błędów .sdata (dla wszystkich zmiennych statycznych) – zebrabox

0

napisałem artykuł o nazwie „C++ Internals :: Memory Layout”, który będzie wyjaśnić to dla ciebie.

Krótki fragment z artykułu:

.text segment

To segment Read-Only, o stałym rozmiarze.

Segment tekstowy, fragment kodu a.k.a., zawiera wykonywalne instrukcje dostarczone przez kompilator i asembler.

.data segment

Jest to odczytu segment o stałym rozmiarze.

Segment danych a.k.a. zainicjowany segment danych zawiera zainicjowany:

  • zmienne globalne (w tym globalnych zmiennych statycznych)
  • statyczne zmienne lokalne.

Rozmiar segmentu zależy od wielkości wartości w kodzie źródłowym, wartości można zmieniać w czasie wykonywania.

.rdata/.rodata segment

Jest to tylko do odczytu segmentu przy

segmentów zawiera dane statyczne nienazwanych (np stałych łańcuchowych)

.bss segment

Jest to Jest to plik Read-Write i sąsiaduje z segmentem .data.

Segment BSS, a.k.a niezainicjowany segment danych, zawiera statycznie zaalokowane (globalne i statyczne) zmienne reprezentowane wyłącznie przez bity o wartości zerowej podczas uruchamiania programu. BSS oznacza Block Started by Symbol, pseudooperację, która istniała w bardzo starym asemblerze opracowanym dla IBM.

heap & stack

Jesteś rację o tym. W każdym razie, jeśli chcesz sprawdzić przykłady i przyjrzeć się bliżej, zapoznaj się z wymienionym artykułem.

Powiązane problemy