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?
Odpowiedz
Prosta odpowiedź: Nie. Nie znam żadnego kompilatora robiącego to.
Powinieneś to skomentować, ponieważ to nie jest prawdziwa odpowiedź. –
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
Hej! Chcę odznakę za 8 zniżek! I: Dlaczego przegrywają? :) – TheBlastOne
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.
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
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
@ Lundin: Pomyślałem o krótkiej i zwięzłej odpowiedzi – Omkant
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.
- 1. Posortuj listę słowników podczas konsolidowania duplikatów w Pythonie?
- 2. Dodawanie znaku w środku ciągu znaków
- 3. Rozdzielanie ciągu znaków w C++
- 4. Przypisywanie literałów łańcuchowych do znaków *
- 5. C++ porównać dwa ciągi literałów
- 6. Wykrywanie kodowania ciągu znaków w C/C++
- 7. Zamień "\\" na "\" w ciągu znaków w C#
- 8. C++ - wyodrębnij liczby z ciągu znaków
- 9. Wstaw wartości zmiennych w środku ciągu
- 10. C# zawiera część ciągu znaków
- 11. Wybieranie tylko pierwszych kilku znaków w ciągu znaków C++
- 12. Zamień wiele znaków w ciągu znaków w Objective-C?
- 13. Odwrotność wszystkich znaków alfabetu w ciągu C#
- 14. Wysyłanie ciągu znaków przez UDP w C++
- 15. C# Regex - Zaakceptuj spacje w ciągu znaków
- 16. Znajdź tekst w ciągu znaków z C#
- 17. format ciągu znaków w języku C#
- 18. C# trzeci indeks znaku w ciągu znaków
- 19. Czy istnieje czysty sposób określania literałów znaków w Swift?
- 20. C++: podział ciągu znaków na tablicę
- 21. Funkcja usuwania spacji z ciągu znaków/znaków w C
- 22. Wartość literałów znaków Java z getNumericValue()
- 23. Usuwanie spacji z ciągu znaków
- 24. Co {} robi w ciągu znaków?
- 25. Dzielenie ciągu znaków za pomocą C++ 11
- 26. Iterowanie za pomocą ciągu znaków C++
- 27. Usuwanie niedozwolonych znaków z ciągu XML C#
- 28. Kod C# do linki na adresy URL w ciągu znaków
- 29. C++ Usuń interpunkcję z ciągu znaków
- 30. C# Regex literowe znaki z ciągu znaków
Masz na myśli literały ze wspólnym sufiksem? –
proszę dodać koder przykładowy – SomeWittyUsername
@Dvorak. Tak, jeśli przez to masz na myśli jeden ciąg to przyrostek innego. Dawny. "abc" i "___abc". – cleong