2012-11-26 7 views
6

Mam wiele literalnych ciągów znaków w moim kodzie źródłowym, które poza tym są identyczne, z wyjątkiem wiodących białych znaków (ze względu na chęć zachowania prawidłowego wcięcia). Czy kompilatory są wystarczająco inteligentne, aby przekonać się, że mogą ponownie wykorzystać przestrzeń w pamięci dla obu, po prostu przesuwając jeden ciąg o kilka bajtów?Podczas konsolidowania duplikatów literałów, kompilator C będzie wyglądać w środku ciągu znaków?

+0

Masz na myśli literały ze wspólnym sufiksem? –

+0

proszę dodać koder przykładowy – SomeWittyUsername

+2

@Dvorak. Tak, jeśli przez to masz na myśli jeden ciąg to przyrostek innego. Dawny. "abc" i "___abc". – cleong

Odpowiedz

-4

Prosta odpowiedź: Nie. Nie znam żadnego kompilatora robiącego to.

+3

Powinieneś to skomentować, ponieważ to nie jest prawdziwa odpowiedź. –

+0

Cóż, pytanie brzmiało, czy istnieją jakieś kompilatory, które wykonują tego rodzaju łączenie ciągów. Tak nie jest, to fakt, o ile wiem. Mogli to zrobić, ale nie robią tego. Co jeszcze powinienem o tym powiedzieć? Że nie byłoby to warte wysiłku? – TheBlastOne

+0

Hej! Chcę odznakę za 8 zniżek! I: Dlaczego przegrywają? :) – TheBlastOne

1

C99 ISO 6.5.2.5 Związek literałami

83) Umożliwia implementacje podzielić przechowywania napisowych i stałych literałach złożonych z tych samych lub z nałożeniem reprezentacji.

+0

Huh ?? Literały złożone nie mają nic wspólnego z literałami ciągów. Ponadto nuty nie są tekstem normatywnym w normach ISO. – Lundin

+0

naprawdę '" notatki stóp nie są normatywnym tekstem w normach ISO "' .... i donno actully znalazłem to trochę sensownego, więc właśnie odpowiedziałem .. dziękuję za informację .. w każdym razie to mówi o obu złożonych i ciągowych literach – Omkant

+0

@ Lundin: Pomyślałem o krótkiej i zwięzłej odpowiedzi – Omkant

1

Krótka odpowiedź: prawdopodobnie.

Długa odpowiedź: zależy od implementacji. Zwykle kompilatory języka C mają funkcję optymalizatora o nazwie "pula ciągów" lub podobną, która umożliwia kompilatorowi przechowywanie wszystkich literałów znaków w systemie ROM.

Zawartość tej puli strun może być następnie zoptymalizowane, ten sam ciąg znaków pojawia się dwa razy prawie na pewno dostać się zoptymalizowane. Myślę, że większość kompilatorów będzie również wystarczająco inteligentna, aby rozpoznać substrady. Ale są też względy platformy, takie jak wyrównanie, więc tylko dlatego, że istnieje podciąg, niekoniecznie oznacza to, że najbardziej efektywne będzie ponowne wykorzystanie tej lokalizacji pamięci.

Nie ma nic w standardzie C, że gwarantuje, że takie optymalizacje są wykonane. Ale jednocześnie nic nie stoi na przeszkodzie w standardzie.

Aby mieć pewność, trzeba sprawdzić dokumentację konkretnego kompilator lub demontować swój program, lub sprawdzić wyjście łącznika.