> ШЕ>Сейчас приходится собеседовать много новичков. > > Вам слишком рано ещё кого-то собеседовать.
Ребята, вот зачем вот это вот всё ?
В форумах по линуксу линуксоиды сруца, какой дистр лучше.
В форумах по плюсам -- кто плюсы знает лучше ...
Может лучше на неправ(иль|ослав)ные технологии свой гнев обращать
хоть когда-нибудь?
ШЕ>void foo()
ШЕ>{
ШЕ> FILE* f=fopen("data.txt","rb");
ШЕ> file_hldr fh(f);//С этого момента, чтобы не случилось для f будет вызван fclose()
ШЕ> ...
ШЕ>}
ШЕ>
Разве это пример RAII?
Вот если бы Ваш file_hldr сам открывал файл...
ШЕ>>void foo()
ШЕ>>{
ШЕ>> FILE* f=fopen("data.txt","rb");
ШЕ>> file_hldr fh(f);//С этого момента, чтобы не случилось для f будет вызван fclose()
ШЕ>> ...
ШЕ>>}
ШЕ>>
VF>Разве это пример RAII? VF>Вот если бы Ваш file_hldr сам открывал файл...
То есть я так понимаю такой код ни есть RAII:
int main() {
FILE *f; ptrdtor UNIQNAME( f = fopen("1.c","r"), call_ifn0(fclose) );
printf("file: %p",f);
//...
}
ну, судя по использованию:
ptrdtor — что-то типа scoped_ptr, но хранящий "deleter"
UNIQNAME — макрос раскрывающийся в типа уникальный идентификатор.
call_ifn0 — унарный функтор, сравнивающий в operator() аргумент на 0, и если не ноль то вызывает функтор переданный в конструкторе с этим аргументом.
AS>>ptrdtor UNIQNAME(...); AS>>typedef std::shared_ptr<void> ptrdtor; P>это как пушкой по воробьям. он же thread-safe ref-count
Э... вопрос то как бы про другое был )
Работает? — Да. RAII? — Тоже да. Просто? — вроде как более чем.
Коротко и понятно без реализации? — ... ну ты же понял.
P>тем более в C++11 можно так
Здравствуйте, Alexéy Sudachén, Вы писали:
AS>Э... вопрос то как бы про другое был )
не спорю
P>>тем более в C++11 можно так AS>Ну, классно да. Десятая студия прожуёт? )
десятая давится, одиннадцатая — давится, gcc-4.5.1 — жуёт.
с одиннадцатой вообще прикол, она на fclose выдаёт, ошибку компиляции, по дефолту! всё, приплыли
Error 1 error C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
в любом случае, для чего там локальная переменная, а не просто return? или это без смысловой нагрузки?
P>в любом случае, для чего там локальная переменная, а не просто return? или это без смысловой нагрузки?
Ну вообще-то простейший способ вернуть структуру, совместимый со всем что движется. Можно конечно конструктор написать ... но зачем? Код в результате всё равно один и тот же будет — записать в rax указатель и выйти из функции. Хотя итоге оно таки заинлайнится и выродится в передачу результата fopen и адреса fclose в конструктор.
Здравствуйте, Alexéy Sudachén, Вы писали:
AS>Ну вообще-то простейший способ вернуть структуру, совместимый со всем что движется. Можно конечно конструктор написать ... но зачем? Код в результате всё равно один и тот же будет — записать в rax указатель и выйти из функции. Хотя итоге оно таки заинлайнится и выродится в передачу результата fopen и адреса fclose в конструктор.
может в этом конкретном случае и заинлайнится. но, вот тот же msvc nrvo не делает в debug, а rvo делает.
да, и к чему тут rax? он вообще может не использоваться, так как nrvo/rvo. ну да ладно..
P>может в этом конкретном случае и заинлайнится. но, вот тот же msvc nrvo не делает в debug, а rvo делает.
Какая разница? Это просто указатель. Мало ли как он представлен и во что завёрнут.
P>да, и к чему тут rax? он вообще может не использоваться, так как nrvo/rvo. ну да ладно..
Э... покажи мне сгенерированный код, возвращающий указатель без использования rax.
Здравствуйте, Alexéy Sudachén, Вы писали:
P>>да, и к чему тут rax? он вообще может не использоваться, так как nrvo/rvo. ну да ладно.. AS>Э... покажи мне сгенерированный код, возвращающий указатель без использования rax.
при rvo/nrvo в функцию передаётся скрытая ссылка, на то, куда писать результат. я предполагал, что в этом случае eax не заполняется. но видимо так оптимальней — чтобы лишний раз не высчитывать.
P>при rvo/nrvo в функцию передаётся скрытая ссылка, на то, куда писать результат. я предполагал, что в этом случае eax не заполняется. но видимо так оптимальней — чтобы лишний раз не высчитывать. P>то есть eax таки используется. но в случае rvo не из-за нужды, а для оптимальности.
Таки получается что чутьё меня не подвело, а CL откровенно тупит. Получается что я был о нём лучшего мнения. Ну и нафиг нужен такой RVO?
#include <stdio.h>
struct A {
void *f;
void operator()() { printf("%p\n",f); }
};
A __declspec(noinline) g(void *p) {
A a = { p };
return a;
}
struct B {
void *f;
B(void *ff) : f(ff) {}
void operator()() { printf("%p\n",f); }
};
B __declspec(noinline) gg(void *p) {
return B(p);
}
int main()
{
A a = g((void*)1);
B b = gg((void*)2);
a();
b();
}
Здравствуйте, Шебеко Евгений, Вы писали:
ШЕ>Если класс не содержит явного копирующего конструктора или operator=, то они создаются неявно. ШЕ>Об этом надо помнить.
Каноническая формулировка называется Law of the Big Three: «если в вашем классе понадобилось явно определить деструктор, копирующий конструктор или оператор присваивания, скорее всего вам нужны все три».