Семен (sim0nsays) wrote,
Семен
sim0nsays

С++ в вопросах на собеседованиях

Давайте и я напишу про любимый С++.

Как известно, С++ - очень сложный язык. Ну прямо очень сложный. И не просто гибкий, а изворотливый. Я его вообще не знаю. Его, наверное, aruslan знает. Во всяком случае, он замечательно про него рассказывает. Мы все ждем "записок на полях стандарта", Руслан!

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


1) Классическое "почему нет частичной специализации функций".
Killer question, один из тех, которые помнят только для того, чтобы валить на собеседованиях. Говорят, длинный ответ написан в Design & Evolution of C++, но я ничитал. Если бы мне такой задали, я бы наверное наивно хлопал глазами и говорил - не, не знаю, расскажите мне, почему?

2) Если есть класс, на который нет внешних указателей и ссылок, то можно ли его перемещать через memcpy?
Ответ - во-первых, разумеется, не должно быть мемберов с указателями внутрь класса. Во-вторых, если есть виртуальное наследование, то это становится implemenation dependent, некоторые компиляторы хранят указатель на виртуальный базовый класс не сдвигом, а голым указателем. MSVC и IntelC - указателем на внешнюю таблицу, gcc - пойнтером, больше не знаю.

3) Какие требования должны выполняться, чтобы можно было заменить new на malloc для класса? (кажется, рассказал some41)
Вопрос многоступенчатый про западло и про внимание к деталям. Разумеется, надо чтобы конструктор был тривальный,
нельзя иметь виртуального наследования и виртуальных функций, нельзя иметь нетрививальные конструкторы у предков и у мемберов. И как завершающий аккорд - необходимо еще заменить delete на free ;)

4) Как получить pure virtual call exception?
Ну, это простенькое. Надо вызвать pure virtual function в конструкторе предка, который ее еще не имплементит. Тонкость в том, что это может потребоваться делать через еще одну функцию, а на прямой вызов компилятор ругнется или соптимизирует.

5) Что хранится в vtable?
Разумеется, адреса виртуальных функций. Еще может быть RTTI info. И нетривиальное - при множественном наследовании сдвиги от this до области класса, которому принадлежит функция (спасибо some41).

6) Найди проблему с exception safety!
Я совсем не специалист, даже Саттера не читал. Лучше сошлюсь на пост _winnie, читать с камментами.

7) Вопросы про перформанс и маллоки STL. А где они там? А как писать, чтобы не? А какой написаны аллокаторы в разных версиях? А чем отличаются стратегии выделения x2 и x1.5? А где опасности копирования объектов? А в чем беды std::string?

В комментах написано еще очень много вопросов, от ситаксического ужаса до хороших (в отличие от предыдущих - каверзных).
ddima вот тут написал хорошие.

Некоторые вопросы из камментов "на тонкости":

8) Чему равна сложность std::list::size и как она связана со сложностью std::list::splice, чем отличаются в этом смысле StlPort и DinkumWare? от _winnie

9) Какой sizeof у struct { char c1; double f1; short c2; }? от ddima

10) Зачем нужен typename? от cyberzx

11) Ну и пожалуй какой-то вопрос на RVO вроде этого.


И еще - мне очень нравится тезис boris_batkin, что беда Advanced C++ в том, что программер играется с языком, вместо того чтобы кодать.

Как обычно, напоследок - no clutter, no gay code!
Tags: tech
Subscribe
  • Post a new comment

    Error

    default userpic
    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 136 comments