2013-10-10 8 views
7

Na przykład, jeśli masz programCzy standard C++ gwarantuje, że literały łańcuchowe są przechowywane w programie binarnym w postaci niezafałszowanej?

int main() 
{ 
    const char* str = "1111111111111111111111111111111111111111111"; 
    printf("%s", str); 

    return 0; 
} 

i skompilować go, jeśli szukać wygenerowany binarny dla „1111111111111111111111111111111111111111111” (pomijając kwestie takie jak kodowanie), jesteś gwarancją go znaleźć, czy jest dopuszczalne jest, aby kompilator generował kod, który na przykład przydziela pamięć sterty, wypełnia ją za pomocą '1 za pomocą pętli, a następnie naprawia wszystkie odwołania do literału, aby wskazać pamięć sterty? (a następnie zapewnia, że ​​zostanie zwolniony w odpowiednim czasie, bla bla)

Wątpię, czy jest jakaś implementacja, która faktycznie to robi ... ale czy to by było zgodne z normami, gdyby tak było?

+0

Nic nie gwarantuje tego. Jedyną rzeczą, która jest standardem (patrzę na roboczą wersję roboczą z 2005 r., Ponieważ nikt nie jest żadnym pieniądzem za podręcznik ...) dyktuje zawartość literałów łańcuchowych (wąskich lub szerokich), ich typ, czas przechowywania , sekwencje specjalne i konkatenacja sąsiednich literałów łańcuchowych. Zobacz [2.13.4 tutaj] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1905.pdf). –

Odpowiedz

10

C++ nie ma żadnej koncepcji "programu binarnego", więc pytanie nie ma sensu.

Gwarancja polega na tym, że wszystkie znaki w łańcuchu są tworzone przez zwiększenie i usunięcie odwołania do wskaźnika str, tzn. Twój ciąg jest przechowywany w pamięci podczas jego pracy.

+2

I ta gwarancja jest wprowadzana tylko * jeśli * faktycznie to robisz (a raczej, że kompilator nie może udowodnić, aż do nieokreślonego zachowania, nie zrobiłeś tego), zgodnie z zasadą "jak gdyby". Co dzieje się, gdy (powiedzmy) program zewnętrzny bada pamięć twojego pliku wykonywalnego nie jest zdefiniowany przez standard C++. – Yakk

0

Nie sądzę, że istnieje jakiś dobry powód dla kompilatora, aby to zrobić zamiast kodować go w skompilowanym programie.

1

Nie, standard nie określa miejsca i sposobu zapisania ciągu znaków. To jest szczegół implementacji.

+0

@Fabrizio Co masz na myśli? To nigdy nie będzie przechowywane w std :: vector –

+0

@Fabrizio: To tylko tablice. To jest jak 'foo (" Hi ");' zostały zamienione na 'foo (__ literal0)', gdzie 'static const char __literal0 [] = {'H', 'i', '\ 0'};'. – GManNickG

1

To zależałoby od kompilatora i architektury komputera, dla którego kompilowany jest kod. Standard C++ nie ma wpływu na sposób przechowywania kodu w jego formacie binarnym.

3

Przechowywanie danych binarnych nie ma wpływu na standard C++

Powiązane problemy