а чем все-таки отличаются С и С++?

Тема в разделе "WASM.HEAP", создана пользователем dZentle_man, 23 окт 2010.

  1. kaspersky

    kaspersky New Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    3.006
    r90
    > Ну-ка, ну-ка. Это уже интересно.
    присоединяюсь. 2k строк это очень маленькая программа. если ее писать по уму на си, то код будет простой, наглядный и понятный. ну если так хочется видить классы -- можно запихать функции в структуры и тогда даже синтаксис будет очень похож на приплюснутый. ну правда члены классов у нас окажутся по дефлоту все публичные, но мы их можем спрятать путем написания правильных .h файлов, в которых объявлен только public.

    да, в программе на миллион строк такое уже не пройдет и там, возможно, классы позволяет дать выигрыш в наглядности/управляемости кода. но ведь неисключено, что наоборот -- классы все угробят. ведь плюсы это в первую очередь проектирование, а не программирование. на си можно сесть и писать, выстраивая структру по ходу дела и программа из 1000 строк может дорасти и до лимона. а вот с плюсами... цена ошибок решений принятых на ранних стадиях проетирования в плюсах в разы выше.

    > Я один из того большинства, и мне очень досадно, что я не вижу пользы в делении на классы.
    кстати, не все программы допускают такое деление вообще. ну вот нам нужно написать heapsort (чисто так из головы). какие тут классы? а ведь некоторые реализации heapsort занимают порядка 2k строк...

    Nafanya
    > Польза от классов в том, что вы планируете архитектуру разрабатываемого
    > приложения на базе взаимодействующих друг с другом объектов.
    классов или объектов? чем объект от класса отличается? а если у нас нету объектов? или они не взаимодействуют? вот допустим, что такое точка? линия? линия как бы совокупность точек -- это да. и фируга состоит из них же. но! если заливать фигуру каждый раз вызывая метод "точка" это будут супержуткие тормоза, особенно если железо поддеживает аппаратную заливку текстурами.

    вот так красивая математическая "лодка" разбивается о хардверный мир реального железа. квадрат это не обязательно четыре отрезка. это может быть отдельная сущность. можно создать класс фигур типа круг, квадрат... а что если у нас на нижнем уровне абстракции есть только треугольник? и потому все фигуры, которые мы можем построить это треугольники? тогда квадрат это два треугольника, а круг -- очень сильно до фига треугольников...

    > Сложная задача дробится на большое количество мелких подзадач.
    в процедурном программировании что ли не дробиться?

    > Каждый объект решает маленькую специфическую для него проблему,
    каждая функция... решает маленькую специфическую...

    > Да Си++ это не только классы. А вы взгляните сколько пользы от полиморфизма.
    а на вред от него же? кстати, он и на си без труда реализуется... совсем без труда.

    > За счёт свойства виртуальности (указатель на базовый класс ссылается на объект
    > одного из производных классов) во время выполнения программы решается
    > какой метод вызвать.
    на си это тоже делается. пускай и руками, но делается. и за счет того, что делается руками, получается даже круче. вот у меня в текущем проекте функция A вызвает функцию B. по указателю. а в этом указателе то, что нам в данный момент нужно. разница с плюсами только в том, что у меня виртуальная таблица явно объявлена и с ней возможны любые махинации, а в плюсах это зарыто внутри самого языка...

    плюсы лишь делают автоматом часть работы с виртуальными функциями. плюс -- писать кода меньше. минус -- код не такой гибкий.
     
  2. kaspersky

    kaspersky New Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    3.006
    wsd
    > а как относитесь к Boost ?
    увы, я пишу на си (без плюсов) и потому пишу без Boost'а. но если учесть, что 1,000 для меня это целый движок, то потребности в плюсах нету. плюсам на таком коде просто не развернуться. как трактору беларусь на дачном участке.
     
  3. dZentle_man

    dZentle_man New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2008
    Сообщения:
    414
    Дык компилил... Hello world откомпилируешь - тоже можно сказать компилил. Скомпилил PoC - тоже компилил. Или компилились действительно объемные и законченные проекты? И если да, то откуда у вас взялась потребность использовать эти компиляторы?

    Че, прямо так сразу и начал компилить нормально? Или вы сначала поимели с ним извращенного секса? Причем извращения с гнусем настолько специфичные, что даже вам они не по вкусу ;)

    Гы. А я думал это стандарт подстроился под практикующееся безобразие и вынужден учитывать разброд и шатания на разных платформах. Мол, вумники на спарке хотят одного, а вумники с интела - другого.

    Порой поражаюсь, как меня могут понять прямо противоположным образом) Я как раз не люблю философствовать, потому что считаю это пустой тратой времени и занятием бесполезным чуть менее чем полностью, и даже вредным. Правда когда-то любил, и само по себе это занятие для меня естественно, поэтому изгоняю как могу и стремлюсь к рационализации и экзистенционализму. На самом деле я подразумевал, что это вы определяете знание и незнание языка на основании философских критериев разграничения, для аналогии я привел знание правил языка(стандарт С) и знание разговорных наречий аборигенов(реализаций компиляторов) - что вы не считаете знание правил необходимым критерием для того, чтобы считать себя знающим язык. И несмотря на то, что у вас есть основания для того, чтобы так считать, у других может быть свой философский фрейм для проведения разграничения, причем он может не совпадать с вашим.

    Вот что значит мой мир ограничивается студией? То, что я не компилил другими компиляторами? Это правда. То, что я не подозреваю о существовании других компиляторов? Так это неправда. То, что я не желаю и не буду никогда пользоваться другими компиляторами? Опять же не правда, просто нельзя объять необъятное, а тем более разом.

    Дык вы противоречите сами себе) Наречия, то бишь компиляторыЭ, действительно нужно знать. А толк в том, что зная ограничения можно с большой степенью точности писать кросс-компиляторный :-D код.
     
  4. kaspersky

    kaspersky New Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    3.006
    dZentle_man
    > Hello world откомпилируешь - тоже можно сказать компилил.
    hell world это конечно сильно ;)

    > Скомпилил PoC - тоже компилил.
    ага. щас. скомпилите. а я на вас посмотрю.

    > Или компилились действительно объемные и законченные проекты?
    > И если да, то откуда у вас взялась потребность использовать эти компиляторы?
    была потребность передачи кода другим лицам. еще в эпоху ms-dos была. а там у кого-то ms, у кого-то багдад, у кого-то ватком, у кого-то вообще полуось. и я был без понятия, что у них там вообще окажется. вот и учился (набивая шишки, конечно), чтобы компилировалось под всем этим зоопарком.

    >> гнусь мои программы компилирует без допила. ну практически
    > Че, прямо так сразу и начал компилить нормально?
    куда бы он делся?

    > А я думал это стандарт подстроился под практикующееся безобразие
    > и вынужден учитывать разброд и шатания на разных платформах.
    вы неправильно понимаете цели и задачи стандарта.

    > Вот что значит мой мир ограничивается студией?
    что вы мыслите категорями конкретного IDE.

    > То, что я не компилил другими компиляторами? Это правда.
    > То, что я не подозреваю о существовании других компиляторов? Так это неправда.
    вы не знаете духа си. вы пишите на нем как на жабе. в чем главное отличие си от жабы? тем что на жабе "на будет так везде и всегда, а кто не так, того сан засудит". а вот в духе си это "это неопределено, и это неопределено, тут вообще хз, а все остальное делаем так, как оно лучше ложится а данную платформу". и потму программирование на си это хождение по минному полю, со всеми вытекающими отсюда плюсами и минусами. плюсы в том, что сегенерированный компилером код действительно быстрый и эффективный. минус в том -- что мы никогда не знаем, что это там за код. и не должны этого знать. ну а вы -- компилируете в уме. поздравляю ;)

    > То, что я не желаю и не буду никогда пользоваться другими компиляторами?
    > Опять же не правда, просто нельзя объять необъятное, а тем более разом.
    короче, на данный момент вы признаете, что да -- компилятор один. где specific, а где стандарт, где у всех так, а где только у ms -- вы не знаете. ну откомпилируйте ядро своей программы хотя бы турбо си и посмотрите на его реакцию ;) а в иделе перенос не должен требовать огромных усилей, даже если вы переносите вместе с логикой еще и интерфейс.
     
  5. Nafanya

    Nafanya Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    581
    kaspersky

    char *p; foo((int)p); -может прокатит:)

    <<чем объект от класса отличается?
    объект - экземпляр класса, под который была выделена память.
    например:
    class My;
    void foo(void){
    My object; //память выделилась в стеке;
    My *p =new My; //память выделилась в куче;
    My *p2; // память зажали и не выделили;
    }

    Может про переполнение буфера побеседуем? И то интересней например ASLR Bypassing.
     
  6. dZentle_man

    dZentle_man New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2008
    Сообщения:
    414
    Охотно отвечу) Правда публиковать ничего не буду, ибо не хотел бы распространяться о сути своей программы, да и не причесано там. А вам же только подставься - сразу пальцами до смерти затыкаете.

    На самом деле все просто. Программа состоит из главного окна, в котором размещено сплиттерное окно, в котором слева treectrl, а справа listctrl. Так вот, на каждое из перечисленных окон - то есть на главное окно, на сплиттер и на два списочных окна заведено по классу. Что это дает:

    -Если мне надо внести изменение в какое-то из этих окон, я сразу знаю в каком классе мне менять и остальная прога при это остается ни при чем, проблемы решаются в рамках отдельного класса и в глаза не лезут функции, которые к этому окну не относятся. Я бы даже наоборот поинтересовался, а как на чистом С вы решаете такую вот проблему - разделения зерен от плевел - функций и данных некоторого окна от функций и данных, к этому окну не относящихся?

    -Внешний вид программы становится более упорядоченным - сразу видно какая часть за что отвечает и даже интересно, а как упорядочиваете свои программы на чистом С вы?

    -Для глобальных переменных и функций создан отдельный класс, хотя я склонен смотреть на него как на временную меру, вызванную недостатком опыта в проектировании и программировании вообще. Но все таки это очень удобно, потому что мнее например не понятно, а как вы, на чистом С отделяете глобальные переменные, к которым могут обратится все четыре окна от более локальных, которые должны быть доступны только для специфического окна(например листконтрола) и доступ других окон к которым может привести к ошибке?
     
  7. osox

    osox New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2009
    Сообщения:
    280
  8. r90

    r90 New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    898
    Nafanya
    Я это слышал. Без практических примеров звучит бессмыслицей, заумной теорией. Замени везде слово "объект" на "функция" и получишь формулировку основной идеи заложенной в процедурный и функциональный подходы к программированию. Не вижу причин верить что деление на объекты лучше деления на функции.

    Я не прошу теории. Я прошу практики: упомянутый пример на 2k строк.
     
  9. kaspersky

    kaspersky New Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    3.006
    Nafanya
    > char *p; foo((int)p); -может прокатит:)
    ага, после явного преобразрвания. а как быть если int у нас 32 бита, а int* -- 64 (или наоборот)? логику разрушить не боитесь? ;)

    > объект - экземпляр класса, под который была выделена память.
    > например:
    пример, плохой. во-первых, если класс целиком состоит из одних невиртуальных функций, то память под него не выделяется и этот класс полностью "расщепляется" еще на стадии компиляции.

    во-вторых, вы писали, что у нас есть "объекты...", а потом соскочили на классы. допустим, у нас есть набор функций для работы с памятью (копирование, сравнение, поиск...) и мы завернули их в один класс. какой сущности будут соответствовать объекты этого класса? ведь память у нас одна ;) а объектов класса память будет много. и это даже не блоки памяти (блоки выделяются аллокатором, а тут мы говорим не об аллокации совсем).

    выходит, что с одной сущностью -- памятью -- у нас будет работать один класс, но этой сущеность будут соответствовать много экземпляров этого класса. то бишь объектов. вам не кажется, что это странным?! более того, если виртуальных функций нет (или их удалил оптимизатор), то сгенерированный компилятором код будет практически полностью идентичен си-программе.

    и в данном случае выделение функций работы в отдельный класс не приводит к созданию новой сущности. а вот если создать такую сущность, например, блок памяти, возвращаемый аллокатором, и создать функции, работающие именно с этой сущностью, то все будет очень стройно и красиво. вот только работать будет более тормозно и сама конструкция утратит гибкость. а вот что она приобретет? оххх... да! это могучий вопрос! на си -- аллокатор это одна сущность, память другая. и потому функция memcpy ничего про первую не знает. отсюда и постоянные переполнения буферов. а вот если мы ввели сущность блока памяти, и создали функцию копирования этого блока (или данных внутри этого блока), то программисту уже не нужно следить за переполнениями, ибо на нижнем уровне абстракции все сводится к вызову функции БЛОК_ПАМЯТИ->взять_ячейку(индекс ячейки). и вот эта функция (в одном единственном месте!) и делает проверку выхода за границы буфера. и все -- все довольны. только тормозит оно.


    > class My;
    > void foo(void){
    > My object; //память выделилась в стеке;
    память под что? листинг в студию. а vtb в стеке -- это новое слво в компиляторостроии

    > My *p =new My; //память выделилась в куче;
    выделили в стеке память под p, а сколько мы выделили в куче - дык это от My завсит. может и не выделили ничего.

    > My *p2; // память зажали и не выделили;
    ага щас блин. так же выделили память под p2 в стеке.
     
  10. kaspersky

    kaspersky New Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    3.006
    Nafanya
    > Может про переполнение буфера побеседуем? И то интересней например ASLR Bypassing.
    давайте. но не в этой теме, хорошо? ибо обход этот больше к JS/Java/AS относится...
     
  11. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    dZentle_man
    код чистый или WTL MFC QT и т.д. ?
     
  12. dZentle_man

    dZentle_man New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2008
    Сообщения:
    414
    wxWidgets)
     
  13. r90

    r90 New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    898
    dZentle_man
    Мог бы отправить мне в почту и попросить оставить моё мнение при себе. Но уже не надо, после "не причёсано там", всё становится ясно: программист который не гордится своим кодом -- это не программист, а просто кодер. Разглядывать его кодесы пытаясь высмотреть там как-надо-писать-программы -- бесполезная трата времени.
    Гуй неинтересен. Интересна обработка данных, алгоритмы, а гуй оставим изучающим дельфи.
    Точно так же как это делают C++ программисты. Осмысленные имена функций. Модульность программы. Комментарии.
     
  14. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    dZentle_man
    речь шла наверно о самодостаточном коде , прибавь размер фраймворка и выйдет напорядок за 2k
     
  15. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    kaspersky
    кто стартует топик?
     
  16. dZentle_man

    dZentle_man New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2008
    Сообщения:
    414
    Пля, наверное) То, что в фремворке делается простой функцией в одну строку, на нейтиве выходило в 5-7 строк, плюс место для переменных) Но я не горжусь использованием фреймворка, в откомпилированном виде экзешник весит мегабайт против 57 килобайт в той версии, что была на нейтиве. В общем то использование его вызвано недостатком опыта и тем, что в нейтив апи винды нет сплиттера.
     
  17. osox

    osox New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2009
    Сообщения:
    280
    да все намного банальней кто на Си никогда
    не писал и начал с С++ у того мозги
    пропитаны учением оопэшников
    именно так и будет пихать ооп и в 2к строк
    и будет видеть плюсы даже в маленькой программке
    учение записанное на девственный мозг
    принимается все на веру не с чем сравнить
     
  18. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    dZentle_man
    позже поймёшь, что она вызванна экономической оправданностью и конкурентоспособностью соответственно
     
  19. dZentle_man

    dZentle_man New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2008
    Сообщения:
    414
    Бгг. Мне то как раз приятно глянуть на свой код, и вдвойне приятно после введения класса для глобальных переменных и не привязанных к какому-то конкретному классу функций. Приятно, даже не смотря на непричесанность. То есть даже недостатки не портят картину. Но какому-нибудь проходимцу не укажешь. Другой и пальцем по подоконнику проведет и покажет - вот мол, пыль, какая кака! А у меня там бумаги по полу разбросаны, но зато какой по полками порядок и столы ничем не завалены - загляденье.

    Я не пытался научить вас писать программы, я пытался объяснить какое преимущество дает упорядочивание по классам.

    Я вот тоже всегда считал, что гуй - последнее дело. Но поскольку хотелось доказать себе, что научусь писать "настоящие" проги, а "настоящими" для меня по историческим причинам - прежде всего гуевые, то и остановился на гуевом проекте. И не так там все просто, гуй - это фасад, а фаршировать его все равно приходится в бекграунде со всей сопутствующей алгоритмизацией. Впрочем фаршировка происходят в нутрях самих классов в Си-стиле, хотя при большой сложности задачи вполне представляю себе как можно применить классы и сильно упростить себе жизнь.

    "Я тоже плевал на здоровье пока ен сходил к врачам" (с) "Крепкий орешек 2". В общем я тоже сначала думал что ничего прекрасней асма нет, потом что ничего прекрасней Си нет, а когда понял что плюсы во многом прекрасней(хотя и в чем то ущербней), то призадумался и решил не спешить с выводами по поводу других языков. Осмысленные имена функций и комментарии - все это используется в необходимых количествах в рамках отдельных классов, но как же упрощает программирование в С-стиле разделение программы на классы, превращающие ее в набор более мелких программ, однако все-таки объединенных между собой вполне понятным интерфейсом...
     
  20. dZentle_man

    dZentle_man New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2008
    Сообщения:
    414
    Что вызвано - использование фреймворка или отсутствие сплиттера в апи винды?