Здравствуйте, vav, Вы писали:
IT>>>>Может стоит организовать раздел на RSDN, посвящённый подобным вопросам?
vav>натолкнулся тут.. http://www.moskalyuk.com/jobs/
Это оттуда.
void send (int *to, int * from, int count)
{
int n = (count + 7) / 8;
switch ( count % 8)
{
case 0: do { *to++ = *from++;
case 7: *to++ = *from++;
case 6: *to++ = *from++;
case 5: *to++ = *from++;
case 4: *to++ = *from++;
case 3: *to++ = *from++;
case 2: *to++ = *from++;
case 1: *to++ = *from++;
} while ( --n > 0 );
}
}
Вроде просто копирование из from в to , но зачем так ?
co>void send (int *to, int * from, int count) co>{ co> int n = (count + 7) / 8; co> switch ( count % 8) co> { co> case 0: do { *to++ = *from++; co> case 7: *to++ = *from++; co> case 6: *to++ = *from++; co> case 5: *to++ = *from++; co> case 4: *to++ = *from++; co> case 3: *to++ = *from++; co> case 2: *to++ = *from++; co> case 1: *to++ = *from++; co> } while ( --n > 0 ); co> } co>}
co>Вроде просто копирование из from в to , но зачем так ?
google + Duff's device
Считаю этот вопрос плохим для интервью.
Этот вопрос больше на кругозор, чем на знание C.
Даже если человек хорошо знает C, но первый раз видит этот приём,
думаю он будет некоторое время в замешательстве.
При нынешнем развитии компиляторов востребованность Duff's device спорна.
Здравствуйте, co, Вы писали:
co>Здравствуйте, vav, Вы писали:
IT>>>>>Может стоит организовать раздел на RSDN, посвящённый подобным вопросам?
vav>>натолкнулся тут.. http://www.moskalyuk.com/jobs/
co>Это оттуда.
co>void send (int *to, int * from, int count) co>{ co> int n = (count + 7) / 8; co> switch ( count % 8) co> { co> case 0: do { *to++ = *from++; co> case 7: *to++ = *from++; co> case 6: *to++ = *from++; co> case 5: *to++ = *from++; co> case 4: *to++ = *from++; co> case 3: *to++ = *from++; co> case 2: *to++ = *from++; co> case 1: *to++ = *from++; co> } while ( --n > 0 ); co> } co>}
co>Вроде просто копирование из from в to , но зачем так ?
Это из Страуструпа — развертка цикла — чтоб быстрей работал (меньше итераций в 8 раз).
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Если в базовом классе деструктор объявлен со словом virtual, то при удалении переменной – указателя на базовый класс, которая реально указывает на экземпляр производного класса, будет вызван деструктор производного класса.
-чем отличается вызов виртуального деструктора от обычной виртуальной
функции
Вызов деструктора происходит неявно, при выполнении оператора delete.
Ответ неполный?
-чем отличаются const char* ptr и char const *ptr
В данном случае – ничем. Это объявление указателя на константу. А если записать так:
char * const ptr , то получим объявление константного указателя на тип char.
-чем чреват выброс исключения из конструктора, деструктора
Если исключение произошло в конструкторе, то объект будет не до конца проинициализирован. Будут вызваны деструкторы полей и базовых классов, которые
проинициализированы полностью. Может быть утечка ресурсов, если они были выделены при неоконченной инициализации какого-либо класса.
При выбрасывании исключения в деструкторе часть полей и базовых классов может быть не разрушена, что приведет к возможной утечке ресурсов.
-в чем потенциальная опасность конструктора копирования по умолчанию
Конструктор копирования по умолчанию делает побитовую копию экземпляра класса. Если в классе используются указатели на какие-либо объекты, то создание копий этих объектов нужно делать самостоятельно. Иначе, при разрушении одного из экземпляров класса, может получиться так, что указатели во втором экземпляре будут указывать на
несуществующие данные.
-чем отличаются операторы приведения типа static_cast, reinterpret_cast, dynamic_cast, const_cast
static_cast — небезопасное приведение, которое происходит на этапе компиляции, проверка на совместимость типов в runtime не происходит.
reinterpret_cast – самое небезопасное преобразование типов, можно приводить любые типы к другим.
dynamic_cast – проверка на совместимость типов происходит как на стадии компиляции, так и в runtime
const_cast – снимает спецификатор «const» с объекта
-метод const. класс const. ключевое слово mutable.
Константный метод класса не может использовать неконстантные поля и методы этого класса. Константным класс объявлен не может.
mutable – нестатический и неконстантный член класса, который можно изменять в константном методе класса.
-как определить чисто виртуальную функцию, абстрактный базовый класс
Чисто виртуальная функция объявляется при помощи символов “=0” в конце объявления. Абстрактный базовый класс объявляется при помощи слова «virtual» в списке наследования.
-как организовать освобождение ресурсов при выходе из функции/метода
При помощи умных указателей. В стандартной библиотеке имеется auto_ptr.
-как запретить создание объектов в куче
Нужно сделать конструктор объекта приватным, а экземпляры создавать при помощи статической функции или специальной фабрики классов.
-как предотвратить утечки памяти связанные с с забывчивостью вызывать Delete
При помощи умных указателей. В стандартной библиотеке имеется auto_ptr.
Также при помощи специализированных медикаментов по рецепту врача.
-как запретить удаление объекта класса
Не давать наружу переменные, указатели и ссылки на объекты этого класса. Использовать функции обертки над методами класса.
-как запретить наследование от данного класса
Не делать деструктор виртуальным
-что такое виртуальный базовый класс (виртуальное наследование)
Класс , который перечислен в списке наследования при помощи слова virtual. Для любого объекта производного класса всегда создается только одна копия такого базового класса.
-что такое частичная специализация шаблона
Задание некоторых ( но не всех ) параметров шаблона для объявления нового типа или переменных нового типа.
-для чего нужен виртуальный конструктор
Под виртуальным конструктором обычно понимают шаблон проектирования – фабрику классов. Служит для создания объектов различных классов в зависимости от входных данных.
-как удалить массив объектов
При помощи оператора delete[]
-в каких случаях вызывается конструктор копирования
-что такое конструктор конверсии. ключевое слово explicit.
Конструктор конверсии служит для создания экземпляра класса по параметру переданному в конструктор. Служит для неявных преобразований при вызове функций.
Слово explicit запрещает неявное создание экземпляров класса.
-в каких случаях переменная класса должна быть проинициализирована в списке инициализации конструктора
Когда класс этой переменной не имеет конструктора по умолчанию, т.е. требуется передача параметров в конструктор.
-когда класс должен иметь конструктор по умолчанию
Когда этот класс используется в качестве «содержимого» в контейнерах.
Ответ не полный?
-когда можно вернуть из функции ссылку на локальный объект
Если он объявлен как статический ( static ).
-почему в C++ нельзя реализовать автоматическую сборку мусора?
Потому что, про объекты созданные на куче нельзя точно сказать вышли ли они за какие-либо пределы видимости или нет, то есть определить время их уничтожения точно нельзя. Вместо этого рекомендуется использовать умные указатели.
Здравствуйте, mopnex, Вы писали:
M>Чисто виртуальная функция объявляется при помощи символов “=0” в конце объявления. Абстрактный базовый класс объявляется при помощи слова «virtual» в списке наследования.
Уверен?
M>-как запретить наследование от данного класса M>Не делать деструктор виртуальным
И что будет?
M>-в каких случаях переменная класса должна быть проинициализирована в списке инициализации конструктора M>Когда класс этой переменной не имеет конструктора по умолчанию, т.е. требуется передача параметров в конструктор.
Про ссылки забыл
"For every complex problem, there is a solution that is simple, neat,
and wrong."
Чем-то напоминает список вопросов к экзаменам ГАИ. Но всё равно, если правила выучил, а водить не умеешь, лучше шофёром не наниматься
А автору спасибо. Будем знать, какие вопросы нужно перефразировать на собеседовании
Здравствуйте, Spidola, Вы писали:
S>Здравствуйте, Awaken, Вы писали:
S>[SKIPPED]
S>Чем-то напоминает список вопросов к экзаменам ГАИ. Но всё равно, если правила выучил, а водить не умеешь, лучше шофёром не наниматься S>А автору спасибо. Будем знать, какие вопросы нужно перефразировать на собеседовании
кстати добрая половина ответов на вопросы по C++ содержится в книгах Мейерса и Страуструпа
Здравствуйте, Awaken, Вы писали:
A>Здравствуйте, Spidola, Вы писали:
S>>Здравствуйте, Awaken, Вы писали:
S>>[SKIPPED]
S>>Чем-то напоминает список вопросов к экзаменам ГАИ. Но всё равно, если правила выучил, а водить не умеешь, лучше шофёром не наниматься S>>А автору спасибо. Будем знать, какие вопросы нужно перефразировать на собеседовании
A>кстати добрая половина ответов на вопросы по C++ содержится в книгах Мейерса и Страуструпа
Здравствуйте, AndrewJD, Вы писали:
AJD>Здравствуйте, mopnex, Вы писали:
M>>Чисто виртуальная функция объявляется при помощи символов “=0” в конце объявления. Абстрактный базовый класс объявляется при помощи слова «virtual» в списке наследования. AJD>Уверен?
Да, здесь ошибся... Абстрактный базовый класс — это класс, имеющий хотя бы одну чисто виртуальную функцию.
M>>-как запретить наследование от данного класса M>>Не делать деструктор виртуальным AJD>И что будет?
Да ничего хорошего. В голову ничего не приходит... В Java есть слово final.
А в плюсах как запретить наследование??
M>>-в каких случаях переменная класса должна быть проинициализирована в списке инициализации конструктора M>>Когда класс этой переменной не имеет конструктора по умолчанию, т.е. требуется передача параметров в конструктор. AJD>Про ссылки забыл
Здравствуйте, mopnex, Вы писали:
M>Да ничего хорошего. В голову ничего не приходит... В Java есть слово final. M>А в плюсах как запретить наследование??
Здравствуйте, mopnex, Вы писали:
M>-в чем потенциальная опасность конструктора копирования по умолчанию
M>Конструктор копирования по умолчанию делает побитовую копию экземпляра класса. Если в классе используются указатели на какие-либо объекты, то создание копий этих объектов нужно делать самостоятельно. Иначе, при разрушении одного из экземпляров класса, может получиться так, что указатели во втором экземпляре будут указывать на M>несуществующие данные.
Неточно. Не побитное копирование. а поэлементное — так в стандарте написано. M>-чем отличаются операторы приведения типа static_cast, reinterpret_cast, dynamic_cast, const_cast
M>static_cast — небезопасное приведение, которое происходит на этапе компиляции, проверка на совместимость типов в runtime не происходит. M>reinterpret_cast – самое небезопасное преобразование типов, можно приводить любые типы к другим. M>dynamic_cast – проверка на совместимость типов происходит как на стадии компиляции, так и в runtime M>const_cast – снимает спецификатор «const» с объекта
Совсем неправильно.
static_cast — самое безопасное приведение, с проверкой типов на этапе компиляции.
reinterpret_cast – самое небезопасное преобразование типов, можно приводить любые типы к другим. Фактического преобразования не происходит. M>dynamic_cast – проверка на совместимость типов происходит как на стадии компиляции, так и в runtime
Что-то я про стадию компиляции ничего не слыхал.
Выполняется только на стадии выполнения для полиморфных классов (полиморфные классы — имеющие виртуальные функции)
применяется для ссылок и указателей на объект полиморфного класса. В случае отказа при преобразовании ссылки возбуждает исключение bad_cast. При отказе для указателей возвращает NULL (0) M>-как определить чисто виртуальную функцию, абстрактный базовый класс M>Чисто виртуальная функция объявляется при помощи символов “=0” в конце объявления. Абстрактный базовый класс объявляется при помощи слова «virtual» в списке наследования.
Абстрактный базовый класс — имеет в составе хотя бы одну чистую виртуальную функцию. А то, что написано — это виртуальная база. M>-как организовать освобождение ресурсов при выходе из функции/метода M>При помощи умных указателей. В стандартной библиотеке имеется auto_ptr.
В конструкторе ресурс получать, в деструкторе — освобождать. Использование для этого auto_ptr — частный случай. M>-как запретить создание объектов в куче M>Нужно сделать конструктор объекта приватным, а экземпляры создавать при помощи статической функции или специальной фабрики классов.
Можно для класса перегрузить new M>-как запретить удаление объекта класса M>Не давать наружу переменные, указатели и ссылки на объекты этого класса. Использовать функции обертки над методами класса.
Один из вариантов — singlton Мейерса
M>-как запретить наследование от данного класса M>Не делать деструктор виртуальным
Не, там должна быть виртуальная база. да еще друзья...
M>-что такое конструктор конверсии. ключевое слово explicit. M>Конструктор конверсии служит для создания экземпляра класса по параметру переданному в конструктор. Служит для неявных преобразований при вызове функций. M>Слово explicit запрещает неявное создание экземпляров класса.
Неточно. Запрещает неявное преобразование при создании. M>-в каких случаях переменная класса должна быть проинициализирована в списке инициализации конструктора M>Когда класс этой переменной не имеет конструктора по умолчанию, т.е. требуется передача параметров в конструктор.
Ну, использовать для этого список инициализации необязательно. А вот для инициализации константных полей класса — обязательно. M>-когда класс должен иметь конструктор по умолчанию M>Когда этот класс используется в качестве «содержимого» в контейнерах. M>Ответ не полный?
Конструктор по умолчанию используется для инициализации глобальных и статических переменных.
M>-почему в C++ нельзя реализовать автоматическую сборку мусора? M>Потому что, про объекты созданные на куче нельзя точно сказать вышли ли они за какие-либо пределы видимости или нет, то есть определить время их уничтожения точно нельзя. Вместо этого рекомендуется использовать умные указатели.
Да можно реализовать, только писать много.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, LaptevVV, Вы писали:
LVV>Совсем неправильно. LVV>static_cast — самое безопасное приведение, с проверкой типов на этапе компиляции.
Да как же оно самое безопасное-то? А если я сделаю неверный downcast?
LVV>Один из вариантов — singlton Мейерса
Можно ссылочку или если нетрудно набросок.
M>>Когда класс этой переменной не имеет конструктора по умолчанию, т.е. требуется передача параметров в конструктор. LVV>Ну, использовать для этого список инициализации необязательно. А вот для инициализации константных полей класса — обязательно.
Как это необязательно?
class A
{
private: A(){};
public: A( int a, int b );
};
class B
{
public: A a;
};
Ну и как можно еще не используя список инициализации проинициализировать а?
Здравствуйте, mopnex, Вы писали:
LVV>>Совсем неправильно. LVV>>static_cast — самое безопасное приведение, с проверкой типов на этапе компиляции. M>Да как же оно самое безопасное-то? А если я сделаю неверный downcast?
По сравнению с reinterpret_cast, которое даже непереносимо — самое безопасное. Поскольку проверяется на этапе компиляции. А как использовать — это уж в меру собственной испорченности LVV>>Один из вариантов — singlton Мейерса M>Можно ссылочку или если нетрудно набросок.
Можно найти в Александреску.
А можно прочитать вот это.
Применение статических элементов класса
Реализация паттернов программирования Singleton и Monostate основана как раз на использовании статических полей и методов. Паттерн Singleton применяется тогда, когда требуется гарантировать существование единственного экземпляра объекта. Такие ситуации в программировании встречаются достаточно часто. Например, при реализации приложения Windows обычно нужно обеспечить защиту от повторного запуска программы. В приложении, которое моделирует работу компьютера, таких объектов — хоть отбавляй: клавиатура, системный таймер, экран монитора. Довольно часто программы пишутся с протоколированием собственных действий в log-файле — обычно этот файл должен быть единственным.
Паттерн Singleton — это класс, написанный определенным способом, который гарантирует, что в программе может быть создано не более одного объекта данного типа. Классический Singleton реализован с помощью указателя (листинг 6.14).
//Листинг 6.14. Классический Singletonclass Singleton
{ public:
static Singleton * Instance(); // функция создания объектаprivate:
Singleton(); // запрет непосредственного создания объекта
Singleton(const Singleton &sg); // закрыто копирование
Singleton& operator=(const Singleton &sg); // закрыто присваивание
~Singleton(); // запрещено уничтожениеstatic Singleton * instance_; // указатель на объект
};
Singleton * Singleton::instance_= 0; // обязательная инициализация
Singleton * Singleton::Instance()
{ if (instance_ == 0) instance_ = new Sigleton();
return instance_;
};
Кроме показанных полей и методов в классе могут быть определены любые другие поля и методы, как открытые, так и закрытые. Да и само имя класса Singleton, естественно, может быть каким угодно — главное, чтобы схема реализации класса соответствовала приведенной.
Как видите, все стандартные средства для создания и уничтожения объекта закрыты. Singleton можно создать только одним способом — вызвав статическую функцию Instance():
Singleton *p = Singleton::Instanse();
Если Singleton уже создан, то эта функция возвращает указатель на него. Таким образом, мы можем иметь сколь угодно много указателей, но объект, на который они указывают — единственный, созданный при первом обращении. Однако пользователь "ненароком" может выполнить операцию delete для указателя p, что является грубой ошибкой. Поэтому Мейерс предложил гораздо более надежный Singleton (листинг 6.15).
В такой реализации статический указатель перекочевал в статический метод, превратившись в локальную статическую переменную, которую в принципе уничтожить невозможно, разве что вообще не создавать. Как и для классического Singletona, можно создавать сколько угодно ссылок, но все они будут ссылаться на единственный экземпляр статической переменной.
M>>>Когда класс этой переменной не имеет конструктора по умолчанию, т.е. требуется передача параметров в конструктор. LVV>>Ну, использовать для этого список инициализации необязательно. А вот для инициализации константных полей класса — обязательно.
M>Как это необязательно? M>class A M>{ M>private: A(){}; M>public: A( int a, int b ); M>}; M>class B M>{ M>public: A a; M>}; M>Ну и как можно еще не используя список инициализации проинициализировать а?
Ага, с этой стороны я не смотрел. Но в чем глубинный смысл запрещения конструктора по умолчанию в данном случае? Константные-то поля никак по-другому не проинициализируешь, кроме как из списка. А тут мы ИСКУССТВЕЕННО запрещаем конструктор по умочанию. ИМХО, проще его не запрещать и использовать по прямому назначению. А тогда список не нужен.
Ы?
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
LVV>По сравнению с reinterpret_cast, которое даже непереносимо — самое безопасное. Поскольку проверяется на этапе компиляции. А как использовать — это уж в меру собственной испорченности
reinterpret_cast непереносимо? он что не является стандартным?
LVV>>>Один из вариантов — singlton Мейерса LVV>В такой реализации статический указатель перекочевал в статический метод, превратившись в локальную статическую переменную, которую в принципе уничтожить невозможно, разве что вообще не создавать. Как и для классического Singletona, можно создавать сколько угодно ссылок, но все они будут ссылаться на единственный экземпляр статической переменной.
А .. это я знал, но не знал что имеет имя — Мейерса.
M>>Ну и как можно еще не используя список инициализации проинициализировать а? LVV>Ага, с этой стороны я не смотрел. Но в чем глубинный смысл запрещения конструктора по умолчанию в данном случае? Константные-то поля никак по-другому не проинициализируешь, кроме как из списка. А тут мы ИСКУССТВЕЕННО запрещаем конструктор по умочанию. ИМХО, проще его не запрещать и использовать по прямому назначению. А тогда список не нужен. LVV>Ы?
Пример конечно искусственный. Константные поля и ссылки — это обязательное условие.
Здравствуйте, mopnex, Вы писали:
LVV>>По сравнению с reinterpret_cast, которое даже непереносимо — самое безопасное. Поскольку проверяется на этапе компиляции. А как использовать — это уж в меру собственной испорченности
M>reinterpret_cast непереносимо? он что не является стандартным?
Является — синтаксически. Но реализация — на усмотрение. И сам Страуструп в своей книжке написал, что это преобразование, как правило, непереносимо.
M>>>Ну и как можно еще не используя список инициализации проинициализировать а? LVV>>Ага, с этой стороны я не смотрел. Но в чем глубинный смысл запрещения конструктора по умолчанию в данном случае? Константные-то поля никак по-другому не проинициализируешь, кроме как из списка. А тут мы ИСКУССТВЕЕННО запрещаем конструктор по умочанию. ИМХО, проще его не запрещать и использовать по прямому назначению. А тогда список не нужен. LVV>>Ы? M>Пример конечно искусственный. Константные поля и ссылки — это обязательное условие.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, Awaken, Вы писали:
>>условные "сторожевые" области типа 0x00000000-0x0000FFFF (причем, она не одна, а их несколько, например, те же >0xFFFF вниз от верхней границы UserMode).
A>а кстати для чего используется этот блок 64Kb в старших адресах пользовательского раздела?
Суть можно уловить из этой ветки, там же мысли на тему почему 64К, а не скажем размер страницы: Re: Не пойму.
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
Здравствуйте, Valerio, Вы писали:
V>Здравствуйте, Awaken, Вы писали:
>>>условные "сторожевые" области типа 0x00000000-0x0000FFFF (причем, она не одна, а их несколько, например, те же >0xFFFF вниз от верхней границы UserMode).
A>>а кстати для чего используется этот блок 64Kb в старших адресах пользовательского раздела? V>Суть можно уловить из этой ветки, там же мысли на тему почему 64К, а не скажем размер страницы: V>Re: Не пойму.
"Не так всё было, не так" (с) Стругацкие. В эти 64К в эпоху DOS запихивали таблицу прерываний (первый килобайт) и далее пихали ядро операционки. Оттуда это ограничение и пришло. Вот что получается, если на сарайчике построить небоскрёб.