C vs. C++ - które funkcje wybrać?

0

Ostatnio uczę się C i C++, i mam dylemat - nie wiem których funkcji używać.
Głównie chodzi mi o różnice w wydajności, zajmowanym miejscu, oraz elastyczności.
Chodzi mi tutaj o takie pary jak np. printf vs. cout itp.

0

Printfa w C, strumieni w C++. Na etapie nauki olej wydajnść. A pytanie jeszcze co chcesz robić - np. programowanie systemowe w Linuxach to raczej C, embedded - zależy jak duże - to w sumie jedno i drugie itd.

3

Używaj tych, które w sposób prosty i czytelny są w stanie rozwiązać Twój problem.

1
Laurefinwe napisał(a):

Ostatnio uczę się C i C++, i mam dylemat - nie wiem których funkcji używać.
Głównie chodzi mi o różnice w wydajności, zajmowanym miejscu, oraz elastyczności.
Chodzi mi tutaj o takie pary jak np. printf vs. cout itp.

Już ci podano - to ma marginalne znaczenie. Dużo istotniejsze jest o to co za program piszesz, co ma robić ect. W przyszłości użycie printfa czy couta będzie tylko wtedy, gdy będziesz musiał coś zdebugować na maszynie na której nie będziesz miał np dostępu do debugera.

0

Czyli zbyt wielkich różnic nie ma i mam używać tego co wygodniejsze.

0

printf jest szybszy ale cout wygodniejszy.

0

Zależy od konkretnej implementacji. W większości jest jak piszesz, ale to nie zawsze jest prawda.

0

Gdzieś kiedyś czytałem, że mniejsza wydajność cout zależy od włączonej synchronizacji z cstdio.

Czyli teoretycznie ustawienie

ios_base::sync_with_stdio(false)

przyspieszy cout ale może powodować komplikacje przy wyświetlaniu:

http://www.cplusplus.com/reference/ios/ios_base/sync_with_stdio/

1

printf jest szybszy ale cout wygodniejszy.

cout wygodniejszy? Bezpieczniejszy to i owszem, ale wygodniejszy? Printf pozwala oddzielić wypisywaną treść od formatowania, cout miesza te dwie rzeczy. Na dodatek formatowanie jest częścią stanu strumienia, w efekcie jak zmienisz np. precyzję liczb, to później musisz pamiętać o tym, aby ją przywrócić do oryginalnej, bo jak nie, to w zupełnie losowym miejscu programu formatowanie się rozwali. I powodzenia w używaniu tego z wielu wątków (w przypadku printf problemu nie ma - opakowujesz printfa w mutex i działa). Trudno sobie wyobrazić bardziej zrypany projekt.

1

Chodzi mi tutaj o takie pary jak np. printf vs. cout itp.

To jest tzw. first world problem ;-)

coutem łatwiej wyświetlić jakiegoś pojedynczego int-a, bo nie trzeba pamiętać printfowych znaczników.

Ale printf trzyma w jednym miejscu cały tekst do wyświetlenia, co pozwala na wyciągnięcie go do zewnętrznego pliku i opracowania różnych wersji językowych.

Na przykład, angielska wersja polecenia format wyświetla procenty tak: (piszę z pamięci)

47 percent completed.

a polska tak:

Pozostało: 47%

Można to za pomocą printf osiągnąć ładując z jakichś zasobów tekst
"%-2d percent completed."
albo
"Pozostało: %-2d%%",
a samo wyświetlanie to tylko wywołanie printfa z tym tekstem i z intem.
W ten sposób tłumacz nie musi grzebać w kodzie, a tylko w danych – tekstach specjalnie dla niego przygotowanych.
Teraz spróbuj to samo osiągnąć cout-em.

0

cout wygodniejszy? Bezpieczniejszy to i owszem, ale wygodniejszy? Printf pozwala oddzielić wypisywaną treść od formatowania, cout miesza te dwie rzeczy. Na dodatek formatowanie jest częścią stanu strumienia, w efekcie jak zmienisz np. precyzję liczb, to później musisz pamiętać o tym, aby ją przywrócić do oryginalnej, bo jak nie, to w zupełnie losowym miejscu programu formatowanie się rozwali.

+1, również jak dla mnie printf jest wygodniejszy. Zresztą wygoda to kwestia gustu, ale podstawową zaletą couta jest rozszerzalność, a nie wygoda.

Jeszcze dodam, że printf został skopiowany wszędzie i podobne rozwiązanie jest dostępne w praktycznie każdym języku programowania, a couta jakoś nikt kopiować nie chce ;).

Ale żeby nie zaczynać kolejnej wojny o cout, na tenat wątku:

Ostatnio uczę się C i C++, i mam dylemat - nie wiem których funkcji używać.
Głównie chodzi mi o różnice w wydajności, zajmowanym miejscu, oraz elastyczności.

W zasadzie kiedy piszesz w C++, masz wybór i nie wiesz która opcja jest lepsza - lepiej domyślnie brać wersje z C++, bo są "nowocześniejsze" i wykorzystują możliwości języka.

1

Generalnie wszyscy są świadomi, że IO streams z C++ nie są najwyższych lotów i można mieć masę zastrzeżeń. Jest stosunkowo wolne, ma za dużo abstrakcji (codecvt i inne), średnio się z niego korzysta. W dalekich planach komitetu standaryzacyjnego jest zastąpienie IO streams, ale jeżeli dobrze pamiętam to póki co Stroustrup na pytanie "co dalej" odpowiada "zaproponujcie coś sami".

1

Argumenty związane z szybkością to dla mnie bzdura. Funkcja, która wypisuje coś na ekran może być tylko powolna, albo bardzo powolna - nikogo to nie obchodzi, bo od tego nie oczekuje się zazwyczaj ogromnej wydajności. Poza tym różnice w prędkości nie są tak dramatyczne znowu i zależą od implementacji - widziałem na SO jakieś posty z pomiarami czasu i cout był szybszy. Jeżeli wydajność jest potrzebna bo wymaga tego projekt i jest to zmierzone wąskie gardło - to należy śmiało użyć printf. Nie wiem skąd w ludziach, którzy zaczynają z programowaniem bierze się taki pociąg do "optmalizowania" i "szybkości".

Zgadzam się, że iostream wymaga napisania dużej ilości kodu żeby osiągnąć to samo co można prosto osiągnąć za pomocą stdio (i to jest wielki minus). Za to printf nie można rozszerzyć i nie można sobie dodać formatu dla swojej klasy - a przeciążanie operatorów << i >> dla strumieni jest normalną praktyką. Tak samo za pomocą scanf nie można wczytać std::string itd.

0

a co sie stalo z

cin >> zmienna
1

Jak ktoś słusznie zauważył, piszesz kod w C -> używaj funkcji z C (bo nie masz innego wyboru),
Programujesz w C++ używaj STL.
Proponuję zwrócić uwagę na to, że choć w większości kod w C skompiluje się jako kod C++, ale to tak naprawdę dwa różne języki. Inaczej się w nich programuje.

0

Niestety, większość z was mnie źle zrozumiała ;(
Nie chodziło mi o różnicę tylko między cout, a printf (jak ktoś słusznie zauważył - po co komuś wydajność, czy ograniczanie rozmiaru (BTW do tego chyba nikt się nie odniósł) przy prostych konsolówkach wypisujących tekst?), ale ogólne różnice między funkcjami w C i ich odpowiednikami w C++.

Dla tych mniej kumatych - chodzi mi również o takie pary jak: cin, scanf, czy funkcje operacji na plikach.

A przy okazji - lepiej używać stringów, czy tablic znaków (chodzi mi o te same różnice co wyżej).

0
Laurefinwe napisał(a):

A przy okazji - lepiej używać stringów, czy tablic znaków (chodzi mi o te same różnice co wyżej).

No to wszystko zależy od przypadku, podobnie jak z funkcjami cout printf. Czasem optymalnie użyć jednego, czasem drugiego, a czasem całkiem innego typu. Umiejętność doboru narzędzia do tego co mamy wykonać jest jedną z umiejętności programistycznych, które nabywa się poprzez doświadczenie. Umieć należy oba, które się wykorzysta - zależy od potrzeby.

1
Laurefinwe napisał(a):

Nie chodziło mi o różnicę tylko między cout, a printf (jak ktoś słusznie zauważył - po co komuś wydajność, czy ograniczanie rozmiaru (BTW do tego chyba nikt się nie odniósł) przy prostych konsolówkach wypisujących tekst?), ale ogólne różnice między funkcjami w C i ich odpowiednikami w C++.

Czyżby?

Laurefinwe napisał(a):

Głównie chodzi mi o różnice w wydajności, zajmowanym miejscu, oraz elastyczności.

A przy okazji - lepiej używać stringów, czy tablic znaków (chodzi mi o te same różnice co wyżej).
Używaj tego co jest wygodniejsze. Co automatycznie wyklucza ręczną zabawę z C-stringami.

0

Czyli chodzi Ci o to czy wydajniejsze jest C czy C++? Tak? To zależy co się robi. Kiedyś pisałem aplikację bazodanową w Qt i wypełniałem tam grida dużą ilością danych. Po przepisaniu tego samego programu na WPF okazało się, że wyświetlanie jest dużo bardziej wydajne. A przecież C# to język wysokiego poziomu i zdawałoby się wolniejszy od C++☺ Wszystko zależy od tego do czego używa się danego języka.Tak samo jest z C i C++. Wymyślisz przykład gdzie C jest szybszy to zaraz ktoś pokaże Ci, że, w takim, a takim przypadku szybszy jest C++ jak z tą konsolą i printfem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1