eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.misc.elektronikaC - łańcuchy tekstowe definiowane w parametrach funkcjiRe: C - łańcuchy tekstowe definiowane w parametrach funkcji
  • Data: 2022-08-27 08:10:45
    Temat: Re: C - łańcuchy tekstowe definiowane w parametrach funkcji
    Od: Atlantis <m...@w...pl> szukaj wiadomości tego autora
    [ pokaż wszystkie nagłówki ]

    On 26.08.2022 22:19, Dawid Rutkowski wrote:

    > Ale wymyśliłeś... Ogólnie należy przypomnieć sobie C - i niezależnie,
    > co zrobi kompilator, taka zmienna będąca argumentem funkcji ma
    > gwarantowany czas życia tylko do wyjścia z tego konkretnego wywołania
    > tej funkcji (a jeszcze może chciałbyś "reentrant"?). Tak jest w C i
    > tyle.

    Jeśli już proponujesz przypomnienie sobie C, to należałoby sobie
    przypomnieć czym jest const char* (albo char*) w tym języku. Tutaj nie
    mamy do czynienia z czymś takim jak String C++ albo innych językach
    wysokiego poziomu. To nie jest obiekt albo kontener na dane, podczas
    tworzenia którego zachodziłaby alokacja pamięci.
    To jest po prostu zwykły wskaźnik, który przechowuje jedną, jedyną
    informację - adres początku łańcucha znaków w pamięci.

    Żeby pokazać różnicę, wyobraźmy sobie następną sytuację w C:


    const char* globalny_wskaznik = NULL;

    void foo(const char* str) {
    globalny_wskaznik=str;
    }

    Z następującą sytuacją w C++:

    std::String globalny_string;

    void bar(std::String str) {
    globalny_string = str;
    }


    Co się stanie po wywołaniu pierwszej funkcji? Otrzyma ona wskaźnik z
    adresem na jakiś obszar w pamięci. Adres ten zostanie przekopiowany do
    globalnego wskaźnika, a sam str zostanie zdjęty ze stosu. To co się
    będzie działo z samymi danymi na które wskazywał nie jest w żaden sposób
    określone - wszystko zależy od tego o jakim typie pamięci mówimy. Mogą
    rezydować wiecznie we flashu, mogą być cały czas dostępne jako zmienna
    globalna w RAM-ie, ale mogą też zniknąć w wyniku zdjęcia ze stosu albo
    dealokacji ze sterty w innej części programu.

    Co się natomiast dzieje w drugim przykłaadzie? Wywołanie funkcji
    powoduje utworzenie obiektu klasy std::String, który zostaje
    zainicjowany konkretnym tekstem i utworzy swoją instancję w pamięci. W
    skutek użycia operacji przypisania zostanie wywołany konstruktor
    kopiujący, który utworzy osobną kopię zawartości str w obiekcie
    globalny_string. Po wyjściu z funkcji bar zostanie wywołany destruktor
    obiektu str, jednak jego globalna kopia będzie nadal istniała.

Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj


Następne wpisy z tego wątku

Najnowsze wątki z tej grupy


Najnowsze wątki

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: