Używanie/mieszanie C w kodzie C ++?
Czy używanie C w C ++ jest złe?
Wiele osób powiedziało mi, że używanie C w C ++ jest złe, ponieważ nie jest tak bezpieczne i wymaga większego zarządzania pamięcią. Powtarzam im, że dopóki wiesz, co robisz, usuniesz swoje „nowe” i uwolnisz „35”, to C nie jest problemem.
Jestem obecnie na forum, na którym jest argument dotyczący
std :: stringkontra
char *. Niektórzy twierdzą, że przydzielanie prostego bloku pamięci
char *jest bardziej wydajne i tak długo, jak go zwolnisz, wszystko w porządku. Z drugiej strony mamy ludzi, którzy twierdzą, że
std :: stringjest lepsze, ponieważ nie ma zarządzania pamięcią, ale jest mniej wydajne.
Więc główne pytanie jest takie:
- Czy mieszanie C/C ++ jest złe Czy należy TYLKO używać 100% C ++ podczas programowania w C ++
Wszelkie odpowiedzi będą mile widziane!
Nie znaleziono powiązanych wyników
Zaproszony:
Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się
12 odpowiedzi
Anonimowy użytkownik
Potwierdzenie od:
Prawda; jeśli jesteś wyjątkowo ostrożny i upewniasz się, że ręcznie posprzątałeś, nie stanowi to problemu. Ale czy naprawdę masz czas na co? Każde wywołanie może wyrzucić .
Jest zawsze
czy łapiesz
każdy
wyjątek, który można zgłosić i ręcznie wyczyścić wszelkie zasoby?
Zaryzykowałbym sugestię, że odpowiedź na to pytanie brzmi „nie”, ponieważ pisanie tego rodzaju kodu jest bardzo żmudne i trudno mieć absolutną pewność, że napisany w ten sposób kod jest poprawny, nawet w przypadku rzadkich błędów.
Jeśli odpowiedź brzmi tak, dlaczego spędzasz tyle czasu na martwieniu się o zarządzanie zasobami? Idiomy C ++, takie jak zarządzanie zasobami ograniczone zakresem (SBRM; bardziej znane jako pozyskiwanie zasobów to inicjalizacja (RAII)) i biblioteki, takie jak biblioteka szablonów standardowych, istnieją, aby pomóc Ci łatwiej pisać poprawny kod. Po co robić coś trudnego, gdy tego nie potrzebujesz?
Czy należy TYLKO używać 100% C ++ podczas programowania w C ++?
Tak, chociaż jeśli istnieje biblioteka C, która robi to, co chcesz, lub jeśli masz starszy kod C, którego chcesz użyć, możesz oczywiście użyć tego kodu; tylko bądź ostrożny. Często najczystszym sposobem na współdziałanie z kodem C jest napisanie wokół niego otoki C ++.
Anonimowy użytkownik
Potwierdzenie od:
Anonimowy użytkownik
Potwierdzenie od:
Moim zdaniem odpowiedź jest dość prosta:
Pisząc projekt w C ++, używaj C ++, unikaj C (i rodziny) i trzymaj się biblioteki standardowej i STL. Zapewnij jednolity interfejs C ++ (w końcu to projekt C ++!)
Korzystając z zewnętrznego projektu w C, który okazuje się być napisany w C, możesz go oczywiście użyć. (patrz przykłady poniżej)
Dwa proste przykłady:
Rozumiem, że oba przykłady są całkiem odpowiednie ... małe ... ale wydaje mi się, że wyrażają one dość ogólną ideę.
Anonimowy użytkownik
Potwierdzenie od:
To zły powód do konserwacji:
* Programista C ++ oczekuje, że cały kod będzie zachowywał się jak C ++.
* programista C oczekuje, że cały kod będzie zachowywał się jak C.
Więc mieszając C ++ i C, naruszasz oczekiwania obu programistów co do tego, jak powinno działać.
Anonimowy użytkownik
Potwierdzenie od:
Anonimowy użytkownik
Potwierdzenie od:
Zazwyczaj chcesz uniknąć pomieszania rzeczy, które mogą powodować zamieszanie, co może później prowadzić do trudnych do znalezienia błędów. To, że „wiesz, co robisz” nie oznacza, że następna osoba, która dotknie Twojego kodu, będzie wiedziała, co robiłeś. Jeśli tworzysz kod, z którego będziesz korzystać tylko Ty, to
prawdopodobnie
ok, ale rzadko.
Używanie C do poprawy wydajności jest w porządku, jeśli jesteś ostrożny. Ale powinieneś to zrobić tylko wtedy, gdy potrzebujesz wydajności. Przedwczesna optymalizacja niskiego poziomu to dzieło diabła.
Bardzo rzadko zdarza się, że użycie funkcji char * zamiast std :: string daje zauważalną korzyść w zakresie wydajności i jest warte kłopotów z zarządzaniem pamięcią tylko wtedy, gdy jest to naprawdę.
Anonimowy użytkownik
Potwierdzenie od:
std :: string nie będzie wolniejszy niż char * (dla char * heap); wiele implementacji jest znacznie szybszych, ponieważ używają prywatnej puli pamięci. W każdym razie niezawodność std :: string znacznie przewyższa (mało prawdopodobne) trafienie perf
Anonimowy użytkownik
Potwierdzenie od:
chociaż subiektywne pytanie: moim zdaniem bardzo uważaj, aby unikać używania c w programach c ++.
Wiele osób powiedziało mi, że używanie C w C ++ jest złe, ponieważ nie jest tak bezpieczne i wymaga większego zarządzania pamięcią. Powtarzam im, że jeśli wiesz, co robisz, usuniesz nowe i zwolnisz przydział malloc, C nie stanowi problemu.
ponownie wprowadzasz wady i niebezpieczeństwa, które c ++ został zaprojektowany, aby przezwyciężyć, i nie jest tak, jak to się robi w programach c ++.
Zwykle używam kodu sprawdzającego/odrzucającego/przepisującego, który wprowadza bazy kodów, np. „C z funkcjami c ++” lub „c ++ z funkcjami c”. Posunąłem się nawet do zmiany malloc, free itp., Aby potwierdzić w głównych przestrzeniach nazw (między innymi).
Obecnie jestem na forum, na którym istnieje kontrowersja wokół std :: string kontra char *. Niektórzy twierdzą, że przydzielanie prostego bloku pamięci char * jest bardziej wydajne i tak długo, jak go zwolnisz, wszystko w porządku. Z drugiej strony są ludzie, którzy twierdzą, że std :: string jest lepszy, ponieważ nie ma zarządzania pamięcią, ale jest mniej wydajny.
istnieje więcej opcji reprezentacji łańcucha w języku c ++ niż std :: string.
moim zdaniem całkowicie dopuszczalne jest tworzenie nowej klasy będącej stringiem i służącej do określonego celu lub następującą po dodatkowych kontraktach (w razie potrzeby). częścią kontraktów takich reprezentacji ciągów jest (oczywiście), że zarządzają one własnymi zasobami za pomocą podczas używania sterty.
jeśli wydajność jest tak ważna, a nie jest idealnym rozwiązaniem dla konkretnego zadania, to c ++ jest wystarczająco potężny, aby wyrazić swój zamiar w tych konkretnych przypadkach, tworząc wyspecjalizowany interfejs w języku c ++. istnieje wiele przypadków, w których jest to dopuszczalne (IMO), ale nie zawsze warte czasu. w każdym razie łatwiej jest nim zarządzać niż integrować c idiomy/style/dangers z programami C ++.
Więc główne pytanie brzmi: czy mieszanie C/C ++ jest złe? Czy powinieneś używać TYLKO 100% C ++ podczas programowania w C ++?
najlepiej jest tworzyć rozwiązania obiektów wielokrotnego użytku do własnych potrzeb. niebezpieczeństwa w powyższym przykładzie można całkowicie hermetyzować (jeśli ta optymalizacja jest naprawdę warta czasu) i napisać przy użyciu idiomów języka C ++ bez poświęcania wydajności i lepszej konserwacji.
Anonimowy użytkownik
Potwierdzenie od:
stałe łańcuchowe
(i
tylko
stałe typu string), konwertując je na tylko wtedy, gdy przechodzisz do interfejsu API, który wymaga . Robienie tego konsekwentnie może wyeliminować ogromną liczbę globalnych konstruktorów, nie powoduje problemów z alokacją pamięci (ponieważ stałe łańcuchowe są stałe, stałe dane), a IMO faktycznie sprawia, że kod jest bardziej przejrzysty - widzisz , wiesz, że będzie to stała łańcuchowa.
Anonimowy użytkownik
Potwierdzenie od:
Pisanie programów w C ++ przy użyciu technik organizacji programów w stylu C może prowadzić do wielu problemów z utrzymywalnością. Ogólnie rzecz biorąc, programista ignoruje wiele zalet, jakie zapewnia język zorientowany obiektowo. Tylko dlatego, że większość składni C jest poprawna w C ++ i wiele metod kodowania jest przenośnych, nie oznacza to, że powinieneś robić je w C ++.
Jednak korzystanie z funkcji C i innych rzeczy nie stanowi problemu, o ile używasz ich ostrożnie. W niektórych przypadkach musisz.
Anonimowy użytkownik
Potwierdzenie od:
profil
; określić, co działa najlepiej w
Twój przypadek
i używaj go mądrze!
Anonimowy użytkownik
Potwierdzenie od:
Z mojego doświadczenia wynika, że tak, oczywiście można mieszać C i C ++. Możesz robić, co chcesz, ale utrzymanie, debugowanie i ustalenie, co się dzieje, staje się wyzwaniem. Łatwo jest powiedzieć, że zamierzasz wyczyścić alokacje pamięci, ale być może ktoś inny używa Twojego kodu i tego nie robi. Może zapomniałeś o tym i straciłeś godziny na szukanie głupich błędów, zamiast wykorzystać ten czas na coś produktywnego. Myślę, że nawet nie powinno być kłótni. Kiedy robisz C ++, zrób C ++. Kiedy robisz C, zrób C.