среда, 23 февраля 2011 г.

Окей, как и обещал - более сложные вопросы по С++

Возможно, не ультрамега, но вопросы довольно каверзные, особенно если от вас хотят получить полный и развернутый ответ. Потерять какую-то тонкость тут как два пальца.
И опять же - если хотите узнать ответ (знаете, но не уверены) - feel free to ask.


1) Классическое "почему нет частичной специализации функций".
2) Если есть класс, на который нет внешних указателей и ссылок, то можно ли его перемещать через memcpy?
3) Какие требования должны выполняться, чтобы можно было заменить new на malloc для класса?
4) Как получить pure virtual call exception?
5) Что хранится в vtable?
6) Какой sizeof у struct { char c1; double f1; short c2; }?
7) Зачем нужен typename?
8) Чем опасен printf и вообще использование ... в функциях?
9) Почему функции strcpy(), sprintf() и другие объявлены в новой версии как deprecated? Чем они страшны?
10) Как лучше возвращать такую структуру: struct f { double x; double y; double z; } - по значению или как-либо еще?
11) Можно ли в рекурсивной функции (глубина вызовов - несколько тысяч) разместить локальную переменную (массив) размером несколько сотен килобайт? Чем это чревато?
12) Как определить закольцованность списка?


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



16 комментариев:

  1. ни на один вопрос я не отвечу, к сожалению. было бы что попроще..

    ОтветитьУдалить
  2. Сходу на все вопросы ответить не смог.

    ОтветитьУдалить
  3. Для меня это глухой лес :)
    Я только дельфи7 начинала но успешно забросила..

    ОтветитьУдалить
  4. Не смог ответить на вопросы 1, 4, 5, 9, 11, 12

    ОтветитьУдалить
  5. Для меня тоже c++ темный лес. Java как то понятней для начинающий. И да, lets holywar begin!

    ОтветитьУдалить
  6. 1) потому что частичная специализация и перегрузка функций делают одно и то же
    2) можно, если нет внутренних ссылок и виртуального наследования (есть опасность сдвинуть базовый класс)
    3) опять нельзя ничего "виртуального" плюс придется заменить все delete на free
    4) вызвать у предка в конструкторе pure virtual function которая не была задана у потомка
    5) адреса виртуальных функций, RTTI и смещение от this до области функций
    6) 24, за счет выравнивания double и границы структуры на 8 байт, после перестановки f1 в начало - будет 16
    7) typename реально необходим только если требуется прекомпиляция шаблонов (например этого требует vc2005)
    8) при компиляции типы никак не проверяются, ошибку такого рода очень сложно отловить
    9) потому что они не защищены от переполнения буфера
    10) по указателю, чтобы избежать копирования (таких структур обычно много, будут лишние накладные затраты)
    11) переполнение стека, рекурсивная функция со всем контентом аллоцируется при каждом вызове
    12) пустить два указателя с шагом 1 и 2, если на каком-то шаге адреса совпадут - список закольцован

    ОтветитьУдалить
  7. Мюсье w422g да вы шарите! Респект вам и уважуха а так же 4 (четыре) чая за счет заведения!

    ОтветитьУдалить
  8. Я не спец в Си, но на два вопроса ответить попытаюсь.

    11) Может быть переполнение стека.

    12) Первое, что пришло в голову - это сохранять в использованные адреса в память, а потом проверять не встречалось ли уже такого. Но выше товарищ предложил способ гораздо лучше.

    ОтветитьУдалить
  9. Fedor комментирует...

    Нужны вопросы полегче.


    Вопросы не нужны

    ОтветитьУдалить
  10. на половину можно ответить не вникая даже в сам язык

    ОтветитьУдалить